2009-06-16 19 views
1

XSLTを使用して、ノードの要素名の部分文字列に基づいてノードを選択するにはどうすればよいですか?例えばXSLT要素名の部分文字列に基づくノードの選択

、XML考える:私は出力したい

<foo_bar>Keep this. 
    <foo_who>Keep this, too. 
    <fu_bar>Don't want this.</fu_bar> 
    </foo_who> 
</foo_bar> 

、そこから:

ここ
<foo_bar>Keep this. 
    <foo_who>Keep this, too. 
    </foo_who> 
</foo_bar> 

を私は、名前がfoo「というような正規表現に一致するノードを処理するために選択します。 * "。

私はXSLTテンプレートのマッチ属性式、または正規表現を要素の名前に適用するapply-templates select属性式が必要だと思います。しかし、これは文のようないくつかの構造がなければできないかもしれませんか?

ご協力いただければ幸いです。

答えて

2

「foo」で始まる要素を見つけ出すXSLがあります。私はRegular Expression Matching in XSLT 2に基づいてXSLT 2.0までregexの機能性が追加されたとは思わない。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="*"> 
     <xsl:variable name="name" select="local-name()"/> 
     <xsl:if test="starts-with($name, 'foo')"> 
      <xsl:copy> 
       <xsl:apply-templates/> 
      </xsl:copy> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

この出力には、改行が追加されているようです。

<foo_bar>Keep this. 
    <foo_who>Keep this, too. 

    </foo_who> 
</foo_bar> 
+0

OPの入力を見ると「starts-with($ name、 'foo_')」をおすすめしますが、そうでなければそれです。 +1 - 余分な改行は、の助けを借りて、次の兄弟::テキスト()ノードをコピーしないことで防ぐことができます。 – Tomalak

+0

私は改行を扱うことができます。ありがとう。 – chernevik

関連する問題