XSLT可以执行XML解码然后处理结果吗?

时间:2019-01-23 20:29:58

标签: xslt

我有这个输入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的值,执行解码并显示y.a或y.b的值?

1 个答案:

答案 0 :(得分:1)

在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的Saxon 9.8,Altova 2017及更高版本也这样做,我认为Saxon的早期版本(至少为9.7)已经支持parse-xml函数,因为我认为XmlPrime 4个。

当然,对于其他或更旧的XSLT 1或2处理器,通常也可以使用专有的方式来使用扩展功能,即使启用了msxsl:script的MSXML 3或6,即XSLT 1处理器,也允许使用扩展功能。