listitems ノードに固有のテンプレート要素があります。
xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:template match="listitems">
<xsl:value-of select="@status" />
</xsl:template>
</xsl:stylesheet>
xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="callvsapply.xslt"?>
<!-- sample XML snippet -->
<xml>
<foo status="No">You are here.</foo>
<bar status="Yes">Hello Bar!</bar>
<baz status="No">Hello Baz!</baz>
<listitems status="Yes" id="13" />
<listitems status="No" id="12" />
</xml>
結果
You are here.
Hello Bar!
Hello Baz!
Yes
No
すべてのテキストが印刷されるのはなぜですか? 私はイエスとノーだけを期待していました。
XSLT には「組み込みテンプレート ルール」という概念があります。これは、テンプレートが適用されている現在のノードに関連するテンプレートが定義されていない場合に使用されるテンプレートです。
それらは次のようになります。
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="processing-instruction()|comment()"/>
これらが要約すると、次のとおりです。
したがって、基本的に、テンプレートがまったく指定されていない場合の XSLT のデフォルトの動作は、ドキュメントを上から下にたどり、途中のすべてのテキスト ノードの値を出力することです。それがあなたが見ているものです.XSLTは、途中で遭遇したすべてのテキストを出力しています。
あなたのケースでこれを解決するには、2 つの基本的なアプローチがあります。
最初のアプローチ: ルート ノード (またはドキュメント要素) で処理をインターセプトし、そこから処理したいノードを直接ターゲットにします。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:apply-templates select="listitems" />
</xsl:template>
<xsl:template match="listitems">
<xsl:value-of select="@status" />
</xsl:template>
</xsl:stylesheet>
2 番目のアプローチ: テキスト ノードの組み込み処理をオーバーライドして、デフォルトで値が出力に送信されないようにします。
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<xsl:template match="listitems">
<xsl:value-of select="@status" />
</xsl:template>
<xsl:template match="text()" />
</xsl:stylesheet>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加