Обработка XML внутри текстового узла XML с помощью XSLT - PullRequest
1 голос
/ 13 октября 2011

У меня есть XML с текстовым узлом, который также является XML. Мне нужно преобразовать этот XML (внешний XML) с помощью XSLT 2.0 и изменить несколько вещей во внутреннем XML (в текстовом узле). Результирующий XML должен иметь ту же структуру, что и входной XML (включая текстовый узел с XML), но с изменениями, примененными к внутреннему XML.

Я использую процессор Saxon XSLT, поэтому у меня есть доступ к функции parse (). Но я не уверен, как использовать его для обработки внутреннего XML, а затем преобразовать его обратно в текстовый узел.

Это пример входного XML:

<tag>
    <innerXml>
         &lt;node1&gt;
           &lt;node2&gt;Value&lt;/node2&gt;
         &lt;/node1&gt;
    </innerXml>
</tag>

И преобразование XSLT выведет:

<tag>
    <innerXml>
         &lt;node1&gt;
           &lt;node2&gt;Some other value&lt;/node2&gt;
         &lt;/node1&gt;
    </innerXml>
</tag>

Обратите внимание, что внутренний XML намного сложнее, поэтому простая замена строки не будет работать.

1 Ответ

3 голосов
/ 13 октября 2011

Ну, вы должны быть в состоянии сделать (где у вас есть xmlns:saxon="http://saxon.sf.net/")

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:saxon="http://saxon.sf.net/"
  xmlns:my="http://example.com/my"
  exclude-result-prefixes="saxon my"

  version="2.0">

<xsl:output name="my:ser" method="xml" omit-xml-declaration="yes"/>

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

<xsl:template match="innerXml">
  <xsl:variable name="temp">
    <xsl:apply-templates select="saxon:parse(.)/node1"/>
  </xsl:variable>
  <xsl:copy>
   <xsl:value-of select="saxon:serialize($temp, 'my:ser')"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="node2[. = 'Value']">
  <xsl:copy>
    <xsl:text>Some other value</xsl:text>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Протестировано с саксонской 9.1. А с коммерческими версиями Saxon 9.3 вы могли бы альтернативно использовать version = "3.0" для таблицы стилей и таким образом использовать встроенные функции разбора и сериализации в пространстве имен функций по умолчанию вместо использования функций расширения Saxon, которые я использовал выше.

...