2017-11-13 26 views
0

私が得ることのできないXSLマッチングの規則については何かがあります。奇妙なXSLマッチングの振る舞い

私は、この入力をした:私が望むように、このXSL作品

<root> 
    <metadata> 
    </metadata> 
    <elements> 
    <a-elems> 
      <a>A1</a> 
      <a>A2</a> 
    </a-elems> 
    <b-elems> 
     <b>B1</b> 
     <b>B2</b> 
    </b-elems> 
    </elements> 
</root> 

<a>値のリストが報告されています

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

    <xsl:template match = "/"> 
     _____ Elements _____ 
     <xsl:apply-templates select = "root/elements/*/*" /> 
    </xsl:template> 


    <xsl:template match = "a-elems/a"> 
    __ A ELEM: <xsl:value-of select = "."></xsl:value-of> __ 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:message>Excluding <xsl:value-of select = "name(.)" /></xsl:message> 
    </xsl:template> 

</xsl:stylesheet> 

しかし、私は私は述べる。このルートテンプレートを、考えます私が始めたいレベルは、よりきれいになります:

<xsl:template match = "/root/elements"> 
    _____ Elements _____ 
    <xsl:apply-templates select = "*/*" /> 
</xsl:template> 

しかし、うまくいきません「ルートを除外する」メッセージが表示され、テンプレートが一致しないことがわかりました。私はなぜ、私はまた、試してみました= "*"と優先度の属性を追加しました。

答えて

1

XSLTは、/(ドキュメントノード)に一致するテンプレートを検索することから始めます。 /に一致するテンプレートを/root/elementsに変更すると、代わりに/の一致のためにbuilt-in template ruleがXSLTに使用されます。これは、組み込みのテンプレート効果的にこれです:

<xsl:template match = "/"> 
    <xsl:apply-templates /> 
</xsl:template> 

xsl:apply-templatesは子rootノードを選択します。これは、*と一致するテンプレートによって照合されるので、メッセージが表示され、処理は完了しません。

最も簡単な解決策は、自分が持っていたものに戻ることです。

編集:あなたのコメントに答えて、必ず/を再定義する必要はありません。元のソリューションのもう1つのわずかなバリエーションは、これを行うことです...

<xsl:template match = "root"> 
    _____ Elements _____ 
    <xsl:apply-templates select = "elements/*/*" /> 
</xsl:template> 
+0

ありがとう。私は動作するアプローチを使用します。それは練習するということは、常に '/'を再定義する必要があるということですか?私は、あなたがトップレベルの下のfeewサブツリーにしか関心がないとき、それが奇妙であると感じます。 – zakmck

+1

'/'を必ずしも再定義する必要はありません。私はちょっとしたバリエーションを使って答えを編集しました。 –