无法使用XSLT转换XML中的特殊字符

时间:2014-04-01 13:44:31

标签: xml xslt

XSLT文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:template match="line1">
<body><xsl:value-of select="line2[@NAME='data']"/></body>
</xsl:template>
</xsl:stylesheet>

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<line1>
  <line2 name="data"><!CDATA[地址:北京经济技术开发区分新<span lang="ZH-CN" style="font-family:SimSun">号诺基亚大厦</span>]</line2>
</line1>

我在转换XML文件中的数据时遇到了问题。当我尝试生成输出XML时,错误:显示无效的XML字符。任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

1)XML实例中的CDATA部分不正确。它在CDATA之前缺少一个左括号,一个右括号和一个关闭角括号。它应该具有以下形式:<![CDATA[ ... ]]>

以下是更正后的表格:

<?xml version="1.0" encoding="UTF-8"?>
<line1>
    <line2 name="data"><![CDATA[地址:北京经济技术开发区分新<span lang="ZH-CN" style="font-family:SimSun">号诺基亚大厦</span>]]></line2>
</line1>

此外,由于您正在寻找name(案例事项),因此您的XSLT将找不到NAME属性。将其更改为:

<xsl:value-of select="line2[@name='data']"/>

这是使用Saxon-EE 9.5.1.3的结果:

<?xml version="1.0" encoding="UTF-8"?>
<body>地址:北京经济技术开发区分新&lt;span lang="ZH-CN" style="font-family:SimSun"&gt;号诺基亚大厦&lt;/span&gt;</body>

2)如果您想保留结果中的CDATA部分,请将cdata-section-elements="body"添加到output

<xsl:output method="xml" indent="yes" encoding="UTF-8" cdata-section-elements="body"/>

你的结果将是:

<body><![CDATA[地址:北京经济技术开发区分新<span lang="ZH-CN" style="font-family:SimSun">号诺基亚大厦</span>]]></body>

3)但似乎您正在尝试构建XML并希望未转义<span>元素。在这种情况下,您应该将disable-output-escaping="yes"添加到xsl:value-of

<xsl:value-of disable-output-escaping="yes" select="line2[@name='data']"/>

(如果您添加了cdata-section-elements="body",请从output移除),然后您的结果将是:

<body>地址:北京经济技术开发区分新<span lang="ZH-CN" style="font-family:SimSun">号诺基亚大厦</span></body>