0

我有以下 XML。我有以下 XSLT。这个 XSLT 工作有一个 for-each 逻辑,可以根据需要在 XML 上工作。现在我希望将相同的逻辑应用于 json 文件,所以我明白我必须首先在我的 XSLT 中编写一些 jsonToXML 逻辑,并且还要有这个 for-each。我不知道该怎么做。任何人都可以帮助我..我在下面有所需的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"
              }
        ]
      }
    }
    }
4

1 回答 1

1

你有两个选择。

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

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

我在 XML 布拉格 2016 的论文中给出了这两种方法的一些工作示例,您可以在此处阅读:https ://www.saxonica.com/papers/xmlprague-2016mhk.pdf - 总体结论是第二种方法是对于许多用例来说可能更容易。但是您的处理非常简单,任何一个都可以很好地工作。

最近我一直在研究一些旨在使第一种方法更强大的 Saxon 扩展:请参阅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 中)。

于 2017-11-30T08:31:53.733 回答