Xpath谓词匹配<! - [CDATA [sometext]] - >

时间:2010-12-23 20:26:09

标签: xslt xpath special-characters

我的xml元素内容包含特殊字符,例如&lt;,&gt;,[,]。我想查找内容<![CDATA[someText]]>的元素,并将其替换为<![CDATA[newValue]]>等新值。

<property name="sourcePath">
    <string><![CDATA[someText]]></string>
</property>`

我正在尝试使用以下xsl模板执行此操作。但它没有用。

<xsl:template match="property[string='<![CDATA[someText]]>']">    
   <xsl:element name="string">                 
                <xsl:text disable-output-escaping="yes">&lt;![CDATA[newValue]]&gt;</xsl:text>
</xsl:element>        

请帮忙。

1 个答案:

答案 0 :(得分:5)

XML INFOSET 中没有预先找到CDATA部分,因此其内容只是常规文本 - 完整的文本节点或文本节点的一部分。

在您的情况下,CDATA部分是完整的文本节点,因此您可以

<xsl:template match="property[string='someEscapedText']">
  <string>newEscapedValue</string>
</xsl:template>

您不需要使用DOE或CDATA - 只需转义NewValue中的字符并使用cdata-section-elements="string"声明的<xsl:output>属性。

这是完整的解决方案

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
 <xsl:output cdata-section-elements="string"
  omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match=
  "property[string='&lt;p>Hello, World&lt;/p>']">
   <string>&lt;p>Hello, You&lt;/p></string>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<property>
 <string><![CDATA[<p>Hello, World</p>]]></string>
</property>

产生了想要的正确结果

<string><![CDATA[<p>Hello, You</p>]]></string>