CDATA - это просто (часть) текстового узла, и то, что выглядит как разметка внутри него, представляет собой одномерный текст (плохо уничтоженная разметка) , и это не может быть выполнено (в XSLT 1.0 и XSLT 2.0 ) без вызова функции расширения.
<p><xsl:copy-of select="my:parse(lfm/artist/bio/summary)"></p>
В XSLT 3.0 может быть новая стандартная функция parse-xml()
, которая делает именно это .
Обновление
Вот полный пример кода, предполагая, что вы используете XslCompiledTransform
в .NET :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:my="my:my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="summary/text()">
<xsl:copy-of select="my:parse(.)/*/*"/>
</xsl:template>
<msxsl:script language="c#" implements-prefix="my">
public XmlDocument parse(string text)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml("<t>"+text+"</t>");
return doc;
}
</msxsl:script>
</xsl:stylesheet>
Когда это преобразование применяется к предоставленному документу XML :
<bio>
<published>Tue, 7 Oct 2008 14:47:26 +0000</published>
<summary><![CDATA[Dream Theater is an American <a href="http://www.last.fm/tag/progressive%20metal" class="bbcode_tag" rel="tag">progressive metal</a> band formed in 1985 under the name "<a href="http://www.last.fm/music/Majesty" class="bbcode_artist">Majesty</a>" by <a href="http://www.last.fm/music/John+Myung" class="bbcode_artist">John Myung</a>, <a href="http://www.last.fm/music/John+Petrucci" class="bbcode_artist">John Petrucci</a>]]>
</summary>
</bio>
желаемый, правильный результат (CDATA заменяется восстановленной разметкой) получается :
<bio>
<published>Tue, 7 Oct 2008 14:47:26 +0000</published>
<summary>
<a href="http://www.last.fm/tag/progressive%20metal" class="bbcode_tag" rel="tag">progressive metal</a>
<a href="http://www.last.fm/music/Majesty" class="bbcode_artist">Majesty</a>
<a href="http://www.last.fm/music/John+Myung" class="bbcode_artist">John Myung</a>
<a href="http://www.last.fm/music/John+Petrucci" class="bbcode_artist">John Petrucci</a>
</summary>
</bio>