Может ли XSLT выполнить XML-декодирование и затем обработать результат? - PullRequest
0 голосов
/ 23 января 2019

У меня есть этот входной XML, который концептуально выглядит примерно так:

<x>
    <a>a text</a>
    <b datamodel="&lt;y>&#xA;    &lt;a>a text&lt;/a>&#xA;    &lt;b>someone's text>&lt;/b>&#xA;&lt;/y>" />
</x>

Значение datamodel - это строка в XML-кодировке другого фрагмента XML:

<y>
    <a>a text</a>
    <b>someone's text></b>
</y>

Примечаниечто

  1. > и ' не закодированы в &gt; и &apos; соответственно
  2. &#xA; представляет ввод

Есть ли способ для XSLT получить значение datamodel, выполнить декодирование и показать значение ya или yb?

1 Ответ

0 голосов
/ 23 января 2019

В XPath 3 или 3.1 у вас есть функция parse-xml, поэтому с любым процессором XSLT 3 или процессором XSLT 2, предоставляющим вам доступ к функциям XPath 3, вы можете выполнять, например, parse-xml(@datamodel)/y/(a, b)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-skip"/>

  <xsl:template match="b[@datamodel]">
      <xsl:copy>
          <xsl:value-of select="parse-xml(@datamodel)/y/(a, b)"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / ncdD7kW использует Saxon 9.8, который реализует XSLT 3, Altova 2017 и более поздние версии, и я думаю, что более ранние версии Saxon (по крайней мере, 9.7) уже поддерживали parse-xml функция, как я думаю, XmlPrime 4.

Конечно, с другим или более старым процессором XSLT 1 или 2 часто существует запатентованный способ использования функции расширения, даже MSXML 3 или 6, процессор XSLT 1, позволил бы это, если включен msxsl:script.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...