我有这个输入XML,从概念上看,像这样:
<x>
<a>a text</a>
<b datamodel="<y>
 <a>a text</a>
 <b>someone's text></b>
</y>" />
</x>
datamodel的值是另一段XML的XML编码字符串:
<y>
<a>a text</a>
<b>someone's text></b>
</y>
请注意
>
和'
未分别编码为>
和'


代表一个回车 XSLT是否有办法检索datamodel
的值,执行解码并显示y.a或y.b的值?
答案 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处理器,也允许使用扩展功能。