XATA和CDATA中的实体

时间:2015-06-23 07:39:35

标签: xml xslt

我有xml:

<?xml version="1.0" encoding="utf-8"?>
<offer>
  <products>
    <product id="1">
                <description>
            <name ><![CDATA[aa&apos;bb]]></name>
            <name2 >aa&apos;bb</name2>
                </description>
    </product>
  </products>
</offer>

和xslt:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                                version="1.0">
<xsl:output method="text"/>
<xsl:strip-space elements="node"/>
<xsl:strip-space elements="*" /> 
<xsl:template match="/offer/products/product" >
<xsl:variable name="title_free" select="description/name"/>
<xsl:variable name="title_free2" select="description/name2"/>
<xsl:value-of select="$title_free"/>
<xsl:text>&#xa;</xsl:text>
<xsl:value-of select="$title_free2"/>
<xsl:text>&#xa;</xsl:text>
</xsl:template>
</xsl:stylesheet>

和xsltproc的输出

$ xsltproc my.xsl my.xml
aa&apos;bb
aa'bb

并且所需的输出应为:

aa'bb
aa'bb

任何想法如何实现?

如何将CDATA字段中的授权替换为字符?

1 个答案:

答案 0 :(得分:2)

CDATA是一种在明确标识的文本中禁用特殊字符的方法。因此,如果您有很多特殊字符,例如<&,例如代码示例中的一小段XML,那么您就不必逃避它们。

如果您在CDATA中写&,则表示字符&(与CDATA外部不同,它引入实体或字符引用)。

所以你要求的基本上是一个XML解析器,它在XSLT 1.0中不存在。如果你问的是如何将字符串替换为另一个字符串(这里&#34; &apos;&#34;进入&#34; '&#34;)那么你可以使用{{1}在XSLT 2.0中或XSLT 1.0中的任何其他字符串操作。

但是我怀疑你真正需要的是解决你的输入数据,它恰好包含一些双重转义(转义字符串将自己封装到CDATA中)。