0

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

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

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

举个例子,输入 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-maps 不是一个选项,因为它们在 XSLT 1.0 中不可用。

4

1 回答 1

0

如果每个人都遵守 XML 之类的标准,它们会带来巨大的成本节约,而如果您尝试使用该标准的修改版、限制版或扩展版,您将得不到任何好处。因此,如果可能的话,您应该更改您的接收应用程序以接受任何合法的 XML,而不是更改您的发送应用程序以生成一个受限制的子集。

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

于 2017-05-03T09:49:56.503 回答