XSLT副本和字符8211

时间:2016-05-18 10:24:59

标签: xml xslt-2.0

我正在使用xslt 2.0并使用copy-of来复制大多数XML。

我有这个XML(有问题的部分):

<nitf>
<body>
<table class="4-col">
<tr><td>Sarpsborg &#8211; Høvik</td><td>6</td><td>-</td><td>8</td>
</tr>
</table>
</body>
</nitf>

这是XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:output indent="yes" media-type="text/xml" method="xml" encoding="ISO-8859-15" />

<xsl:template name="createBody">
    <xsl:copy-of select="/nitf/body"  />
</xsl:template>

输出是:

<nitf>
<body>
    <table class="4-col">
        <tr>
           <td>Sarpsborg &#x2013; Høvik</td>
           <td>6</td>
           <td>-</td>
           <td>8</td>
        </tr>
    </table>
</body>
</nitf>

预期的输出应该是:

<nitf>
<body>
    <table class="4-col">
        <tr>
           <td>Sarpsborg &#8211; Høvik</td>
           <td>6</td>
           <td>-</td>
           <td>8</td>
        </tr>
    </table>
</body>
</nitf>

解决方案

感谢Martin Honnen,我通过添加对某些撒克逊扩展的引用来获得正确的输出。因为我们有商业许可证,所以我可以使用此扩展程序。 您可以通过将saxon命名空间添加到样式表根节点来添加它:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:saxon="http://saxon.sf.net/"
    exclude-result-prefixes="xs"
    version="2.0">

然后将以下内容添加到xsl:output元素:saxon:character-representation =“decimal” 那么你的输出应该是这样(或者至少是我的):

<xsl:output indent="yes" encoding="ISO-8859-15" saxon:character-representation="decimal" />

Martin Honnen在他的回答中链接到此扩展,所以请仔细阅读此扩展如何工作。

1 个答案:

答案 0 :(得分:2)

XSLT处理器使用XML解析器将您的输入XML解析为具有Unicode字符的节点树。该树根本不包含任何字符引用,只包含字符。如果将文本节点复制到输出并将输出序列化为文件,则XSLT处理器会序列化文本节点,并在序列化规则和编码所需的范围内转义任何字符。无法在所选输出编码中表示的Unicode字符将根据需要进行转义,但编码(即十六进制或十进制)的选择取决于XSLT处理器。

如果您使用Saxon的商业版本,请参阅http://saxonica.com/html/documentation/extensions/output-extras/serialization-parameters.html并尝试设置<xsl:output saxon:character-representation="decimal" xmlns:saxon="http://saxon.sf.net/"/>,以强制执行十进制表示。

如果您确实需要保留字符引用,那么您需要预处理XML,例如LexEv http://andrewjwelch.com/lexev/,以将它们转换为您可以处理的标记。