XSLT 将 Json 替换为等效的纯文本

问题描述 投票:0回答:1

在 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 中已经内置了任何内容吗?

json xml xslt xml-parsing xslt-1.0
1个回答
0
投票

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 等商业产品。

© www.soinside.com 2019 - 2024. All rights reserved.