XSLT3.0中的Json To XML

时间:2017-11-30 06:16:13

标签: json xml xslt xslt-3.0

我有以下XML。我有以下XSLT。这个XSLT工作有一个for-each逻辑,可以根据需要在XML上运行。现在我希望将相同的逻辑应用于json文件,所以我理解我必须首先在我的XSLT中编写somejsonToXML逻辑,并且还要为每个人编写。我没有得到如何做到这一点。任何人都可以帮助我..我有下面要求的Json。这不过是XML的转换。

XML是:

    <?xml version="1.0"?>
    <Records>
        <Record>
            <Field name="Second Name" alias="Second_Name">Lilly</Field>
            <Field name="Last Name" alias="Last_Name">James</Field>
            <Field name="Middle Name" alias="Middle_Name">J</Field>
            <Field name="Address" alias="Address">R C Villa</Field>
            <Field name="City" alias="City">Pagarh</Field>
            <Field name="State" alias="State">Kansas</Field>
            <Field name="Zip Code" alias="Zip_Code">8878</Field>
        </Record>
    </Records>

适用于上述XML的XSLT如下:

        <?xml version='1.0'?>
        <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output media-type="xml" indent="yes"/>

        <!--Attributes are not supported at all levels, as well as to allow for each field 
        to be mappable you would need to change the element names to be unique before being consumed through Data Feed.-->

        <xsl:template match="/">
        <Records>
            <xsl:for-each select="Records/Record">
                <Record>
                    <xsl:for-each select="Field">
                        <xsl:element name="{@alias}">
                            <xsl:value-of select="."/>
                        </xsl:element>
                    </xsl:for-each>
                </Record>
            </xsl:for-each>
        </Records>
        </xsl:template>

        </xsl:stylesheet><!-- Stylus Studio meta-information - (c) 2004-2009. Progress Software Corporation. All rights reserved.

        -->

如果我有以下Json,那么XSLT 3.0会是什么?

    {
      "Records": {
        "Record": [
          {
            "Field": [
              {
                "-name": "Second Name",
                "-alias": "Second_Name",
                "#text": "James"
              },
              {
                "-name": "Last Name",
                "-alias": "Last_Name",
                "#text": "Shcol"
              },
              {
                "-name": "Middle Name",
                "-alias": "Middle_Name",
                "#text": "J"
              },
              {
                "-name": "Address",
                "-alias": "Address",
                "#text": "BishusPame"
              },
              {
                "-name": "City",
                "-alias": "City",
                "#text": "Hitlas"
              },
              {
                "-name": "State",
                "-alias": "State",
                "#text": "Vietnam"
              }
        ]
      }
    }
    }

1 个答案:

答案 0 :(得分:1)

您有两种选择。

您可以将JSON(使用parse-json()json-doc())解析为地图和数组的结构,然后对地图和数组进行操作。

或者,您可以将JSON转换为XML(使用json-to-xml()),然后对XML进行操作。

我在XML Prague 2016的论文中给出了两种方法的实例,你可以在这里阅读:https://www.saxonica.com/papers/xmlprague-2016mhk.pdf - 总体结论是第二种方法对于许多用例来说可能更容易。但是你的处理非常简单,要么完美无缺。

最近,我一直致力于一些旨在使第一种方法更强大的撒克逊扩展:请参阅http://dev.saxonica.com/blog/mike/2017/11/transforming-json.html(尽管产品尚未提供此产品)。

如果您使用parse-json() / json-doc()方法,那么我认为它看起来像这样(未经测试):

<xsl:for-each select="json-doc($json-uri)?Records?Record?*">
  <Record>
    <xsl:for-each select="?Field?*">
      <xsl:element name="{?('-alias')}">{?('#text')}</xsl:element>
    </xsl:for-each>
  </Record>
</xsl:for-each>

注意将数组转换为序列需要“?*”,因为xsl:for-each将迭代序列,但不会遍历数组。

(该示例使用文本值模板,因此它在样式表级别采用expand-text="yes",默认情况下我将其包含在XSLT 3.0中。