Предикат Xpath для соответствия - PullRequest
0 голосов
/ 23 декабря 2010

Содержимое моего элемента xml содержит специальные символы, такие как <,>, [,].Я хочу найти элемент, объединяющий содержимое <![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 Ответ

5 голосов
/ 23 декабря 2010

Раздел CDATA не сохраняется в XML INFOSET , поэтому его содержимое представляет собой обычный текст - полный текстовый узел или часть текстового узла.

В вашем случае секция 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>
...