我的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"><![CDATA[newValue]]></xsl:text>
</xsl:element>
请帮忙。
答案 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='<p>Hello, World</p>']">
<string><p>Hello, You</p></string>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档:
<property>
<string><![CDATA[<p>Hello, World</p>]]></string>
</property>
产生了想要的正确结果:
<string><![CDATA[<p>Hello, You</p>]]></string>