首页 > 解决方案 > XSLT 可以执行 XML 解码然后处理结果吗?

问题描述

我有这个输入 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 的值?

标签: xslt

解决方案


在 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使用实现 XSLT 3、Altova 2017 和更高版本的 Saxon 9.8,我认为早期版本的 Saxon(至少 9.7)已经支持该parse-xml功能,因为我认为 XmlPrime 4 可以。

当然,对于其他或更旧的 XSLT 1 或 2 处理器,通常有一种专有方式来使用扩展功能,即使是 MSXML 3 或 6,一个 XSLT 1 处理器,只要msxsl:script启用它,也将允许这样做。


推荐阅读