XSL: изменить содержимое в XML - PullRequest
0 голосов
/ 15 июля 2011

У меня есть XML, в котором есть другой XML (внутри CDATA).Теперь я хочу изменить содержимое дочернего XML.Как это возможно?

В приведенном ниже XML-коде, если Тип адреса является Домашним, я хочу изменить его на «01».Возможно ли это в XSLT 1.0 ??

<?xml>
 <a>
   <b>This is Parent</b>
   <c>
     <![CDATA[
       <?xml>
         <a1>This is Child XML></a1>
         <person_address type="Home">
           <street>ABCDStreet</street>
           <city/>
           <country/>
         </person_address>
     ]]>
  </c>
</a>

Ответы [ 3 ]

0 голосов
/ 15 июля 2011

Вам необходимо извлечь текст раздела CDATA и передать его в анализатор XML для обработки.Некоторые процессоры XSLT имеют функцию расширения для этого, например saxon: parse (), или вы можете написать свой собственный, например, на Java или Javascript.

0 голосов
/ 15 июля 2011

Все, что содержится в разделе CDATA, не является разметкой - это всего лишь одномерный текст.

Либо обработайте его как текст (что некрасиво и неудобно), либо напишите функцию расширения, которая анализирует свой аргумент в XmlDocument и возвращает этот результат обратно. Затем вы можете обработать результат с помощью XSLT:

 <xsl:apply-templates select="my:parse(theString)/*"/>

Конечно, чтобы это работало, вы должны убедиться, что текст, передаваемый в функцию расширения my:parse(), является правильно сформированным (сериализованным) XML-документом - что в вашем примере это не так.

0 голосов
/ 15 июля 2011

Как описано в связанном вопросе выше в комментарии, вы не можете трактовать содержимое CDATA как XML, это чистый текст.

Первое простое решение, которое приходит на ум (не говоря уже о лучшем): в вашем случае (XSLT 1.0 и простая замена текста) вы можете использовать некоторый шаблон расширения EXSLT, например replace(), чтобы сопоставить строку с регулярным выражением и заменить ее на Разыскиваемая ценность

...