我使用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>< > " & '</B>
<B>< > " & '</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>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
结果是:
<?xml version="1.0" encoding="UTF-8"?>
<X ATTR="< > " & '"/>
<X ATTR="< > " & '"/>
我之后的结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<X ATTR="< > " & '"/>
<X ATTR="< > " & '"/>
我尝试在样式表之前添加以下内容:
<!DOCTYPE xsl:stylesheet [
<!ENTITY amp "&">
]>
或
<!ENTITY amp "&#38;">
但它没有用(即无论是否有实体定义,结果都是一样的。)
我也理解character-map
不是一个选项,因为它们在XSLT 1.0中不可用。
答案 0 :(得分:0)
如果每个人都遵守这些标准,那么像XML这样的标准会带来巨大的成本节省,如果您尝试使用标准的修改版或限制版或扩展版,则不会获得任何好处。因此,如果可能,您应该更改您的接收应用程序以接受任何合法的XML,而不是更改您的发送应用程序以生成受限制的子集。
如果接收应用程序不接受&
,这可能意味着它正在使用某种家庭酿造解析器而不是标准的XML解析器,这可能意味着它还有许多其他不必要的限制,将在申请的整个生命周期中逐渐出现。