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 块?

//编辑这里的东西测试: http ://www.ladimolnar.com/JavaScriptTools/XSLTransform.aspx

4

1 回答 1

1

由于默认模板规则

<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 回答