在XSLT 2.0转换期间保留字符十六进制代码

时间:2013-10-01 19:12:52

标签: xslt xslt-2.0 saxon

我有以下XML:

<root>
   <child value="&#xFF;&#xEF;&#x99;&#xE0;"/>
</root>

当我进行转换时,我希望保留字符十六进制代码值。因此,如果我的变换只是一个简单的xsl:copy并且输入是上面的XML,那么输出应该与输入相同。

我已经阅读了saxon:character-representation函数,但是现在我正在使用Saxon-HE 9.4,因此我无法使用该函数,而且我甚至不能100%确定它会执行我的操作想。

我还读到了use-character-maps。这似乎解决了我的问题,但我宁愿不在我的转换中添加一个巨大的映射来捕获每个可能的字符十六进制代码。

<xsl:character-map name="characterMap">
    <xsl:output-character character="&#xA0;" string="&amp;#xA0;"/>
    <xsl:output-character character="&#xA1;" string="&amp;#xA1;"/>
    <!-- 93 more entries... &#xA1; through &#xFE; -->
    <xsl:output-character character="&#xFF;" string="&amp;#xFF;"/>
</xsl:character-map>

还有其他方法可以保留字符十六进制代码吗?

1 个答案:

答案 0 :(得分:1)

XSLT处理器不知道字符在输入中的表示方式 - 这些都由XML解析器处理。所以它无法再现原作。

如果要使用数字字符引用输出所有非ASCII字符,无论它们在输入中如何表示,请尝试使用xsl:output encoding =“us-ascii”。

如果你真的需要保留原始表示 - 我看不出任何人需要这样做的任何可辩护的理由 - 那么试试Andrew Welch的lexev,它将所有实体和字符引用转换为处理指令in,并在出路时返回实体/角色参考。