2012-03-14 1 views
0

У меня есть это сообщение с содержимым CDATA. Я хочу, чтобы превратить его в формат unCDATA, такие как:Могу ли я использовать xsl для превращения CDATA в разделенную версию? Я имею в виду unCDATA содержимое

<?xml version="1.0" encoding="UTF-8"?> 
<mymessage <![CDATA[<xyz>1234</xyz>]]></mymessage> 

turn into 

<?xml version="1.0" encoding="UTF-8"?> 
<mymessage &lt;xyz>1234&lt;/xyz></mymessage> 

Так что я хочу, чтобы избавиться от CDATA и превратить мое сообщение раздели версии. Кто-нибудь знает, как использовать xsl для этого? Или это можно сделать в xsl?

+0

Кажется, что вы не видите '' '' 'mymessage'. Почему вы все равно хотите это сделать? Большинство людей с подобным запросом склонны пренебрегать разбитыми синтаксическими анализаторами XML (в этом случае правильным решением является исправить парсер вместо этого). – Quentin

ответ

0

Вы можете даже избежать экранирующих символов (когда собственно XML узлов в CDATA блоков!), Применяя следующее:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    xmlns:dt="http://exslt.org/dates-and-times" 
    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="dt exsl"> 

    <xsl:output method="xml" encoding="utf-8" indent="yes"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="text()"> 
     <xsl:value-of select="." disable-output-escaping="yes"/> 
    </xsl:template> 

</xsl:stylesheet> 

, который при нанесении на

<?xml version="1.0" encoding="UTF-8"?> 
<mymessage><![CDATA[<xyz>1234</xyz>]]></mymessage> 

дает

<?xml version="1.0" encoding="utf-8"?> 
<mymessage><xyz>1234</xyz></mymessage> 

В общем, конечно, это не рекомендуется (блок CDATA был помещен там по причине), так что лучше оставить его текст соответствующий шаблон(). В этом случае результат будет

<?xml version="1.0" encoding="utf-8"?> 
<mymessage>&lt;xyz&gt;1234&lt;/xyz&gt;</mymessage> 
1

По умолчанию соответствующий XSL-процессор будет выполнять то, о чем вы просите. Если вы хотите сохранить разделы CDATA вы на самом деле добавить

<xsl:output cdata-section-elements="mymessage"/> 

в таблице стилей