为什么我的XSLT输出中的额外文本?

时间:2016-04-11 20:04:06

标签: xml xslt

以下是XML和XSLT的示例:

XML

false

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <count>5</count>
  <idx>10</idx>
  <cds>
    <cd>
      <title>Empire Burlesque</title>
      <artist>Bob Dylan</artist>
      <country>USA</country>
      <company>Columbia</company>
      <price>10.90</price>
      <year>1985</year>
    </cd>
    <cd>
      <title>Hide your heart</title>
      <artist>Bonnie Tyler</artist>
      <country>UK</country>
      <company>CBS Records</company>
      <price>9.90</price>
      <year>1988</year>
    </cd>
  </cds>
</catalog>

问题:为什么在转换给定的XML文档时,元素的内容为 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" omit-xml-declaration="yes" standalone="yes" /> <xsl:template match="/catalog/cds"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th style="text-align:left">Title</th> <th style="text-align:left">Artist</th> </tr> <xsl:for-each select="cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> count 是否一直在桌子前打印出来?

3 个答案:

答案 0 :(得分:3)

XSLT built-in templates正在这样做。具体做法是:

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

您可以覆盖,或只是更改匹配cds

的模板
<xsl:template match="/catalog/cds">

匹配/

<xsl:template match="/">

将避免虚假文本节点输出。

答案 1 :(得分:2)

您编写的唯一模板与<xsl:template match="/catalog/cds">匹配,然而处理从文档节点开始,在您的情况下使用内置模板https://www.w3.org/TR/xslt#built-in-rule,因此您必须编写匹配{的模板{1}}或/或者您必须确保编写的模板不会为您不想生成任何输出的元素输出任何内容。

答案 2 :(得分:1)

另一个选择是使用不执行任何操作的版本覆盖样式表中的内置模板规则:

<xsl:template match="text()|@*" mode="#all"/>