xsltproc生成的输出超出预期

时间:2011-11-23 16:12:06

标签: xslt

我正在尝试编写一个简单的.xslt来处理.xml文件。但我一直很困惑 - 为什么标签<tag>text</tag>中的文字也被打印出来? 请看一下例子:

  

sample.xml中

<source>
    <employee>
        <firstName>Joe</firstName>
        <surname>Smith</surname>
    </employee>
</source>
  

style.xsl

<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="surname">
    <div>
        <xsl:value-of select="name()"/>
    </div>
</xsl:template>
</xsl:stylesheet>

为什么在致电后:xsltproc style.xslt sample.xml我正在

Joe
<div>surname</div>

而不是

<div>surname</div>

2 个答案:

答案 0 :(得分:4)

这是因为Joe正在handled by default。通常默认输出文本节点。您需要覆盖默认行为。

<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

  <!--Added to match all other nodes/attributes.-->
  <xsl:template match="node()|@*">
    <xsl:apply-templates select="node()|@*"/>
  </xsl:template>

  <xsl:template match="surname">
    <div>
      <xsl:value-of select="name()"/>
    </div>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:2)

处理从文档节点开始,有built-in templates处理,直到模板匹配为止。您已经有一个建议来覆盖默认模板,在您的情况下,另一种方法可能是明确选择姓氏元素进行处理,例如。

<xsl:template match="/">
  <xsl:apply-templates select="source/employee/surname"/>
</xsl:template>