在 XSLT 上有一个 XSLT 输出,其中在元素中包含一些 json。
<company:Cause>
<j:Cause s:id="Cause-08D628B86EF2">
<nc:DescriptionText>{"code":"PC","description":"Probable Cause"}</nc:DescriptionText>
<nc:ActivityDate>
<nc:DateTime>2018-10-02T00:00:00</nc:DateTime>
</nc:ActivityDate>
<j:Name>{"code":"PC","description":"Probable Cause"}</j:Name>
<company:Augmentation>
<j:Stat>
<j:DescriptionText>{"code":"PC","description":"Probable Cause"}</j:DescriptionText>
</j:Stat>
</company:Augmentation>
</j:Cause>
</company:Cause>
我一直在四处寻找 XSLT 是否可以用字符串替换 json:
例如:
<company:Cause>
<j:Cause s:id="Cause-08D628B86EF2">
<nc:DescriptionText>code PC description Probable Cause</nc:DescriptionText>
<nc:ActivityDate>
<nc:DateTime>2018-10-02T00:00:00</nc:DateTime>
</nc:ActivityDate>
<j:Name>code PC description Probable Cause</j:Name>
<company:Augmentation>
<j:Stat>
<j:DescriptionText>code PC description Probable Cause</j:DescriptionText>
</j:Stat>
</company:Augmentation>
</j:Cause>
</company:Cause>
是否可以向 XSLT 添加任何内容以便即时执行此操作? XSLT 中已经内置了任何内容吗?
XSLT 3 可以解析/处理 JSON:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:function name="mf:try-json-to-xml" as="xs:boolean">
<xsl:param name="json" as="xs:string"/>
<xsl:try>
<xsl:sequence select="if (json-to-xml($json)) then true() else false()"/>
<xsl:catch select="false()"/>
</xsl:try>
</xsl:function>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:mode name="text"/>
<xsl:template mode="text" match="fn:*[@key and not(*)]">{@key} {.}{if (position() lt last()) then ' ' else ()}</xsl:template>
<xsl:template match="*[not(*) and mf:try-json-to-xml(.)]">
<xsl:copy>
<xsl:apply-templates select="json-to-xml(.)" mode="text"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在浏览器中使用纯 JavaScript 运行 SaxonJS 的示例小提琴。
在浏览器中使用 CheerpJ 3 运行 Saxon HE 12 Java 的示例小提琴。
XSLT 3 自 2017 年以来一直是 XSLT 的当前版本,目前通过免费使用的库(例如,用于 Java 的 Saxon HE 12 Java、用于 C/C++ 和 Python 和 PHP 的 SaxonC 12、用于 JavaScript 和 Node.js 的 SaxonJS 2.6 以及用于 .NET 框架或 .NET 6/8 的 Saxon HE 10 .NET。
还有 Altova RaptorXML 或 SaxonCS 等商业产品。