Могу ли я использовать xsl, чтобы превратить CDATA в раздетую версию?Я имею ввиду unCDATA контент - PullRequest
0 голосов
/ 14 марта 2012

У меня есть это сообщение с содержимым 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?

Ответы [ 2 ]

1 голос
/ 14 марта 2012

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

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

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

0 голосов
/ 14 марта 2012

Вы даже можете избежать escape-символов (при наличии правильных узлов 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>
...