xml, xsl преобразование с CDATA - PullRequest
2 голосов
/ 25 ноября 2011

Я новичок в xsl xml преобразовании.На данный момент у меня есть 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
   &quot;<a href="http://www.last.fm/music/Majesty"
   class="bbcode_artist">Majesty</a>&quot; 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>

И мой файл xsl содержит это:

<h3><xsl:value-of select="lfm/artist/bio/published"/></h3>
<p>
   <xsl:value-of select="lfm/artist/bio/summary" disable-output-escaping="yes"/>
</p>
<html>
   <body>
      <xsl:value-of select="lfm/artist/bio/content"/>
   </body>
</html>

Что я пытаюсь сделать сейчас, это извлечьструктурированные по тегу данные выводятся из <summary><[CDATA[]]></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>

На данный момент, когда я открываю страницу XML, она отображает все содержимое CDATA, дажес этими тегами HTML ... Я хочу, чтобы эти теги правильно выполнять свою работу в форме HTML.

извините за ужасное описание ... надеюсь, вы, ребята, можете понять, что я имею в виду ...

1 Ответ

4 голосов
/ 25 ноября 2011

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("&lt;t>"+text+"&lt;/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 &quot;<a href="http://www.last.fm/music/Majesty" class="bbcode_artist">Majesty</a>&quot; 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...