XHML实体引用被XSLT吞噬

时间:2012-03-08 17:11:26

标签: xml xslt xhtml

我正在将XHTML文件转换为XML。我遇到了XHML实体引用的问题,这些问题都在这个过程中被吞噬,即& copy等实体;正在消失在输出中。

我的代码如下:

<?xml version="1.0" encoding="utf-8"?>

<xsl:output method="xml" indent="yes"/>

  <xsl:template match="h1|h2|h3|h4|h5|h6|h7|h8|h9">
    <heading>
      <xsl:attribute name="name">
        <xsl:value-of select="name(.)" />
      </xsl:attribute>
      <xsl:attribute name="content">
        <xsl:value-of select="." />
      </xsl:attribute>

    </heading>
  </xsl:template>

    <xsl:template match="/html/body">
      <mapping>
        <xsl:apply-templates select="h1|h2|h3|h4|h5|h6|h7|h8|h9" />        
      </mapping>
    </xsl:template>
</xsl:stylesheet>

在输出中,任何实体引用都会消失。我已经尝试将实体定义添加到我的XSL中......没有运气。

有什么建议吗?

安东

2 个答案:

答案 0 :(得分:2)

实体引用需要DTD。确保源文档包含DTD,并且您不禁用实体解析。

您希望发生的是输入中的&copy;在输出文档中变为©。您不希望输出文档中包含实体引用。

答案 1 :(得分:1)

在XSLT启动之前,实体都是由XML解析器(概念上)扩展的,XSLt不知道实体引用是否被使用,因此无法保留它们。如果您不希望非ascii字符显示为字符,那么最简单的解决方案是指定编码,例如

<xsl:output encoding="US-ASCII"/>

然后任何非ascii字符将被编码为十进制或十六进制数字引用,因此版权将以&#169;而不是©(假设您的输出实际上是由XSLT序列化)。