XSLT - 转换unicode字符

时间:2017-02-08 09:42:25

标签: xml xslt unicode xslt-2.0

我有一个像这样的xml,

<doc>
    <?PIValue  &#x00D2;&#x00D3;&#x00D4;&#x00D5;&#x00D6;&#x00D8; &#x00C0;&#x00C1;&#x00C2;&#x00C3;&#x00C4;&#x00C5;?>
    <p>&#x00D2;&#x00D3;&#x00D4;&#x00D5;&#x00D6;&#x00D8; &#x00C0;&#x00C1;&#x00C2;&#x00C3;&#x00C4;&#x00C5;</p>
</doc>

我对此XML进行了XSLT转换,如下所示,

<xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="doc">
        <doc>
            <xsl:apply-templates/>
            <p2><xsl:value-of select="processing-instruction('PIValue')"/></p2>
        </doc>
    </xsl:template>

    <xsl:template match="p">
        <p1>
            <xsl:apply-templates/>
        </p1>
    </xsl:template>

上面的输出改变了这个,

<doc>
    <?PIValue &#x00D2;&#x00D3;&#x00D4;&#x00D5;&#x00D6;&#x00D8; &#x00C0;&#x00C1;&#x00C2;&#x00C3;&#x00C4;&#x00C5;?>
    <p1>ÒÓÔÕÖØ ÀÁÂÃÄÅ</p1>
    <p2>&amp;#x00D2;&amp;#x00D3;&amp;#x00D4;&amp;#x00D5;&amp;#x00D6;&amp;#x00D8; &amp;#x00C0;&amp;#x00C1;&amp;#x00C2;&amp;#x00C3;&amp;#x00C4;&amp;#x00C5;</p2>
</doc>

正如您所见,<p>元素内的unicode字符在输出中显示为普通文本(在<p1>元素内)。但是处理指令中的相同unicode字符没有显示为输出中的相关字符(<p2>元素内)。

如何更改变换以在元素中显示文本字符串。

expected output,

<doc>
    <?PIValue &#x00D2;&#x00D3;&#x00D4;&#x00D5;&#x00D6;&#x00D8; &#x00C0;&#x00C1;&#x00C2;&#x00C3;&#x00C4;&#x00C5;?>
    <p1>ÒÓÔÕÖØ ÀÁÂÃÄÅ</p1>
    <p2>ÒÓÔÕÖØ ÀÁÂÃÄÅ</p2>
</doc>

2 个答案:

答案 0 :(得分:3)

在XML中,字符引用(如&#xd2;)在元素和属性内容中被识别,但在处理指令或注释中不被识别。因此,在处理指令中,字符串&#x00D2;只是一个包含8个字符的字符串,而不是对单个字符xD2的引用。

如果你想将&#x00D2;字符串解释为字符引用,那么你可以将它们提交给XML解析器(如Martin Honnen建议的那样),或者你可以解析它们&#34;手工和#34 ;在你自己的代码中。它并不困难:xsl:analyze-string将提取'00D2'部分,编写递归函数将十六进制转换为整数是相当简单的,然后最后一部分是调用codepoints-to-string将整数代码转换为字符(=长度为1的字符串)。

答案 1 :(得分:-1)

如果您可以切换到XSLT 3.0,则可以使用

@org.springframework.boot.autoconfigure.domain.EntityScan