ノードを処理して、それらのノードのサブセットを再度処理したいと思います。可能な限り簡素化モード出力のXSLTテンプレートには、他のモードで一致するはずの要素が含まれています。
XML、:
<root>
<s>
</s>
<s>
<n>
<w a="Hello"/>
<n>
<x/>
<w a="he said"/>
</n>
</n>
<n>
<w a="how are you"/>
</n>
<n>
</n>
<n>
<w a="she answered"/>
<n>
<n>
<x/>
<w a="friendly"/>
</n>
</n>
</n>
</s>
</root>
私は二回、いくつかのワットのノードを処理する必要があるように、私はモードを使用することにしました。私は 'a-attribute'にマッチする2つのモード( 'fromone'、 'fromtwo'という読みやすさのために)とモードなしで空のテンプレートを追加しても同じ結果を残しています。
<xsl:template match="root/s">
<output>
<one>
<xsl:apply-templates select="descendant::w"/>
</one>
<x>
<xsl:apply-templates select="n"/>
</x>
</output>
</xsl:template>
<xsl:template match="n[x]">
<xsl:apply-templates select="descendant::w/@a" mode="fromtwo"/>
</xsl:template>
<xsl:template match="w">
<xsl:apply-templates select="@a" mode="fromone"/>
</xsl:template>
<xsl:template match="@a" mode="fromtwo">
<fromtwo>
<xsl:value-of select="."/>
</fromtwo>
</xsl:template>
<xsl:template match="@a" mode="fromone">
<fromone>
<xsl:value-of select="."/>
</fromone>
</xsl:template>
は、私は、出力は次のようになりことを期待:
<root>
<output>
<one>
<fromone>Hello</fromone>
<fromone>he said</fromone>
<fromone>how are you</fromone>
<fromone>she answered</fromone>
<fromone>friendly</fromone>
</one>
<x>
<fromtwo>he said</fromtwo>
<fromtwo>friendly</fromtwo>
</x>
</output>
</root>
XSLTの関連部分は、また、オリジナルのテンプレートは、主に(モードを持つものを除く)の条件に一致し、簡素化
しかし、実際の結果では、ノードxは、私が「fromone」に、他のテンプレート・コールから来るだけ一致させると期待の要素が含まれています
<x>
<fromone>Hello</fromone>
<fromtwo>he said</fromtwo>
<fromone>how are you</fromone>
<fromone>she answered</fromone>
<fromtwo>friendly</fromtwo>
</x>
これは私が試したすべてのXSLTプロセッサーから得た結果で、私はテンプレートの構造に誤りがあると想定しています。モードの問題で他の投稿を読んだ後でも、私は解決策に近づくことができず、XSLTのエラーを見つけることもできません。
私は何の間違いをしましたか?
なぜ結果に 'fromtwo'の出力のみを表示するのではなく、両方のテンプレートの混合出力があるのですか?
:
は、上記のあなたのサンプルに適用すると、それは次のような出力が得られまた、空のw-matchingテンプレートを作成することでこれを解決できますか? –はい、最初からモードを一致させるとします。しかし、選択的な適用は、より簡単で効率的です。 –