0

なぜそのデータを取得するのですか:

<A>
  <B>block 1</B>
  <B>block 2</B>
  <C>
    no
  </C>
  <B>block 3</B>
</A>

そしてこの変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method= "html" indent="yes"/>

<xsl:template match="A/B">
  <xsl:value-of select="."/> <br/>
</xsl:template>

</xsl:stylesheet>

次の出力:

block 1
block 2
no block 3

私はそれが次のようになることを期待しています:

block 1
block 2
block 3

では、なぜ C ブロックが含まれているのでしょうか?

//EDIT ここでテスト済み: http://www.ladimolnar.com/JavaScriptTools/XSLTransform.aspx

4

1 に答える 1

1

Default Template Rulesのため。

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

<xsl:template match="text()|@*">
  <xsl:value-of select="."/>
</xsl:template>

XSL プロセッサは、一致するテンプレートを探して、各ノードを順番に調べます。見つからない場合は、テキストを出力するだけのデフォルトのテンプレートが使用されます。あなたの場合、次のことが起こります(「一致しない」とは、スタイルシートに一致しないことを意味します):

/A         no match, apply-templates (default element template)
/A/B       match, output text
/A/B       match, output text
/A/C       no match, apply-templates
/A/C/text  no match, output text (default text template)
/A/B       match, output text

パスをスキップする/A/Cには、空のテンプレートを追加するだけです

<xsl:template match="A/C"/>

これにより、不要な要素が一致し、出力が抑制されます。

于 2012-08-09T18:10:24.067 に答える