我正在使用 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>< > " & '</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
s 不是一个选项,因为它们在 XSLT 1.0 中不可用。