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

0 xslt xpath special-characters

我的xml元素内容有特殊字符,如<,>,[,].我想找到元素macthing内容<![CDATA[someText]]>,并用一些新的值替换它<![CDATA[newValue]]>.

<property name="sourcePath">
    <string><![CDATA[someText]]></string>
</property>`
Run Code Online (Sandbox Code Playgroud)

我试图使用下面的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>        
Run Code Online (Sandbox Code Playgroud)

请帮忙.

Dim*_*hev 5

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

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

<xsl:template match="property[string='someEscapedText']">
  <string>newEscapedValue</string>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

您不需要使用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>
Run Code Online (Sandbox Code Playgroud)

当此转换应用于以下XML文档时:

<property>
 <string><![CDATA[<p>Hello, World</p>]]></string>
</property>
Run Code Online (Sandbox Code Playgroud)

产生了想要的正确结果:

<string><![CDATA[<p>Hello, You</p>]]></string>
Run Code Online (Sandbox Code Playgroud)