XSLT 1.0使用数字引用输出XML转义字符

时间:2017-05-03 07:59:13

标签: xml xslt xslt-1.0 libxslt

我使用libxslt(xsltproc命令)将XML文档转换为另一种XML。

我想知道是否有一种简单的方法可以请求libxslt对输出中的XML转义字符使用数字引用(例如&&)。 原因是使用输出的应用程序不了解预定义的实体(&),但确实理解数字字符引用。

我知道有一些复杂的方法可以实现这一点,但我想我可能会错过一个简单的样式表指示或命令行选项。如果没有,修改消费应用程序可能会更有意义。

举个例子,输入XML是:

<?xml version="1.0" encoding="UTF-8"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <B>&lt; &gt; &quot; &amp; &apos;</B>
  <B>&#60; &#62; &#34; &#38; &#39;</B>
</A>

XSL是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="/">
    <xsl:apply-templates select="/A/B" />
  </xsl:template>

  <xsl:template match="B">
    <X><xsl:attribute name="ATTR"><xsl:value-of select="." /></xsl:attribute></X>
    <xsl:text>&#x0A;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

结果是:

<?xml version="1.0" encoding="UTF-8"?>
<X ATTR="&lt; &gt; &quot; &amp; '"/>
<X ATTR="&lt; &gt; &quot; &amp; '"/>

我之后的结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<X ATTR="&#60; &#62; &#34; &#38; '"/>
<X ATTR="&#60; &#62; &#34; &#38; '"/>

我尝试在样式表之前添加以下内容:

<!DOCTYPE xsl:stylesheet [
  <!ENTITY amp "&#38;">
]>

  <!ENTITY amp "&#38;#38;">

但它没有用(即无论是否有实体定义,结果都是一样的。)

我也理解character-map不是一个选项,因为它们在XSLT 1.0中不可用。

1 个答案:

答案 0 :(得分:0)

如果每个人都遵守这些标准,那么像XML这样的标准会带来巨大的成本节省,如果您尝试使用标准的修改版或限制版或扩展版,则不会获得任何好处。因此,如果可能,您应该更改您的接收应用程序以接受任何合法的XML,而不是更改您的发送应用程序以生成受限制的子集。

如果接收应用程序不接受&amp;,这可能意味着它正在使用某种家庭酿造解析器而不是标准的XML解析器,这可能意味着它还有许多其他不必要的限制,将在申请的整个生命周期中逐渐出现。