实体更换

时间:2017-10-12 12:45:10

标签: xml xslt

我想替换xml以下的实体,

<para>&#160;&#160;&#160;&#160;&#160;&#160;&#160;2015033555</para>
<para>New York • Stuttgart • Delhi • Rio de Janeiro</para>

输出应为

<para>&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;&#x00A0;2015033555</para>        
<para>New York &#x2022; Stuttgart &#x2022; Delhi &#x2022; Rio de Janeiro</para>

XSLT就像,

<xsl:template match="//text()">

    <xsl:copy-of select="replace(.,'&#160;','&#x00A0;')"/>
  <xsl:copy-of select="replace(.,'•','&#x2022;')"/>        
</xsl:template>

使用上面提到的xslt,它没有给出正确的输出。你能帮忙用来取代实体。

1 个答案:

答案 0 :(得分:3)

使用字符映射(https://www.w3.org/TR/xslt-30/#character-maps):

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output use-character-maps="m1"/>

    <xsl:character-map name="m1">
        <xsl:output-character character="&#160;" string="&amp;#x00A0;"/>
        <xsl:output-character character="•" string="&amp;#x2022;"/>        
    </xsl:character-map>

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

http://xsltransform.net/pNmBy22的在线示例。

请记住,XSLT处理器不知道输入是字面上的字符还是数字字符引用或者是十六进制字符引用,还是某个命名实体引用,因为它使用底层XML解析器来解析词法输入XML进入XSLT / XPath树模型,它只具有值为Unicode字符序列的节点。因此,上面的字符映射方法将输出XSLT作为序列&#x00A0;和任何点&#x2022;输出的任何非中断空间,与原始输入标记无关。