Json 到 XSLT3.0 中的 XML
Json To XML in XSLT3.0
我有以下XML。我有以下 XSLT。这个 XSLT 作品有一个 for-each 逻辑,可以根据需要在 XML 上工作。现在我希望将相同的逻辑应用于 json 文件,所以我明白我必须首先在我的 XSLT 中编写一些 jsonToXML 逻辑并且还有这个用于 -每个。我不知道该怎么做。任何人都可以帮助我.. 我在下面有所需的 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"
}
]
}
}
}
你有两个选择。
您可以将JSON(使用parse-json()
或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 中)。
我有以下XML。我有以下 XSLT。这个 XSLT 作品有一个 for-each 逻辑,可以根据需要在 XML 上工作。现在我希望将相同的逻辑应用于 json 文件,所以我明白我必须首先在我的 XSLT 中编写一些 jsonToXML 逻辑并且还有这个用于 -每个。我不知道该怎么做。任何人都可以帮助我.. 我在下面有所需的 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"
}
]
}
}
}
你有两个选择。
您可以将JSON(使用parse-json()
或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 中)。