从 XML 中取消转义用户定义的实体

unescape userdefined entities from xml

提问人:Rahul 提问时间:7/10/2023 更新时间:7/20/2023 访问量:39

问:

输入 xml 中有一些用户定义的实体,如 和 。 我们在下面的 xsl 中将这些实体定义为 DOCTYPE:-&key;‐

<!DOCTYPE xsl:stylesheet [
<!ENTITY key "&amp;key;">
<!ENTITY hyphen "&amp;hyphen;">
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">
<xsl:output method="xml" omit-xml-declaration="no" use-character-maps="mdash" />
<xsl:character-map name="mdash">
<xsl:output-character character="&#x2014;" string="&amp;mdash;"/>
<xsl:output-character character="&amp;" string="&amp;amp;" />
<xsl:output-character character="&quot;" string="&amp;quot;" />
<xsl:output-character character="&apos;" string="&amp;apos;" />
<xsl:output-character character="&sect;" string="&amp;sect;" />
<xsl:output-character character="&key;" string="&amp;key;" />
<xsl:output-character character="&hyphen;" string="&amp;hyphen;" />
</xsl:character-map>
<xsl:mode on-no-match="shallow-copy"/>
</xsl:stylesheet>

现在在输出中,entites 也应该保持不变,即 和。 但是,在输出字符中使用在 DOCTYPE 下定义的用户定义的实体时,会发生以下错误:-&key;&hyphen;

Static error at xsl:output-character
XTSE0020: character attribute must be a single XML character

有没有办法使用它或取消转义输出 xml 中的实体 和 ?&key;&hyphen;

XSLT XML 解析 Saxon Saxparser XSLT-3.0

评论

0赞 Martin Honnen 7/10/2023
如果您声明,例如 然后是 属性值,例如 例如,即包含五个字符的字符串 、 、 、 。所以很明显,没有满足成为单个角色的要求。<!ENTITY key "&amp;key;">character="&key;"&key;&key;character
0赞 Rahul 7/10/2023
对于这些用户定义的实体,是否有任何替代方法代替输出字符?
0赞 Michael Kay 7/10/2023
从这一点退后一步并解释您想要实现的目标确实会有所帮助。通常,DTD 声明的实体不能很好地与 XSLT 配合使用。你能用完全不同的方式解决业务需求吗?
0赞 Martin Honnen 7/10/2023
如前所述,Saxon 的商业版本有一些扩展来处理实体引用/DTD,例如 saxonica.com/html/documentation12/extensions/instructions/... 或 on in saxonica.com/html/documentation12/extensions/output-extras/...。但我同意 Michael Kay 的观点,从所有相关问题和所有实体内容来看,您似乎正在尝试使用 XSLT 实现一些并不真正支持且可能没有必要的东西(就纯 XSLT/XML 处理而言)。saxon:internal-dtd-subsetxsl:output
0赞 Daniel Haley 7/10/2023
相关/重复问题:stackoverflow.com/q/5985615/317052

答:

0赞 Michael Kay 7/20/2023 #1

有没有办法使用它或取消转义输出 xml for &key 中的实体;和 ‐?

字符映射提供了一种更改 XSLT 输出中各个字符的序列化的方法。它们不提供更改任意字符串序列化的方法。所以简单的答案是“不”。

如果您真的想在序列化输出中生成实体引用,我的建议是 XSLT 处理器应该生成类似的东西,并且您应该在后处理阶段将其转换为(使用非 XML 感知工具)。§key;&key;

但是,我还会考虑使用实体引用是否是满足业务需求的最佳方式。使用 XInclude 元素或处理指令可以为您提供更大的灵活性。