具有不同类型的多个子级的XSLT值

时间:2012-08-09 18:03:37

标签: xslt xpath value-of

为什么我要使用这些数据:

<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

1 个答案:

答案 0 :(得分: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"/>

这将匹配不需要的元素并抑制输出。