JSON 到 XML 使用 XSLT 3.0 使用 saxon
JSON to XML with XSLT 3.0 using saxon
我正在使用 XSLT 3.0 通过函数 json-to-xml、
转换此文档 JSON to this document XML
<xsl:variable name="input-as-xml" select="json-to-xml(.)"/>
我从撒克逊传递这个 json 像文档 XML:
String XML = "<root>" + JSON + "</root>";
我在调用函数 json-to-xml:
时得到一个 XML
<?xml version="1.0" encoding="utf-8"?>
<map
xmlns="http://www.w3.org/2005/xpath-functions">
<string key="_D">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2</string>
<string key="_S">urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2</string>
<string key="_B">urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2</string>
<array key="Invoice">
<map>
<array key="ID">
<map>
<string key="IdentifierContent">123</string>
</map>
</array>
<array key="IssueDate">
<map>
<string key="DateContent">2011-09-22</string>
</map>
</array>
<array key="InvoicePeriod">
<map>
<array key="StartDate">
<map>
<string key="DateContent">2011-08-01</string>
</map>
</array>
<array key="EndDate">
<map>
<string key="DateContent">2011-08-31</string>
</map>
</array>
</map>
</array>
<array key="AccountingSupplierParty">
<map>
<array key="Party">
<map>
<array key="PartyName">
<map>
<array key="Name">
<map>
<string key="TextContent">Custom Cotter Pins</string>
</map>
</array>
</map>
</array>
</map>
</array>
</map>
</array>
<array key="AccountingCustomerParty">
<map>
<array key="Party">
<map>
<array key="PartyName">
<map>
<array key="Name">
<map>
<string key="TextContent">North American Veeblefetzer</string>
</map>
</array>
</map>
</array>
</map>
</array>
</map>
</array>
<array key="LegalMonetaryTotal">
<map>
<array key="PayableAmount">
<map>
<number key="AmountContent">100.00</number>
<string key="AmountCurrencyIdentifier">CAD</string>
</map>
</array>
</map>
</array>
<array key="InvoiceLine">
<map>
<array key="ID">
<map>
<string key="IdentifierContent">1</string>
</map>
</array>
<array key="LineExtensionAmount">
<map>
<number key="AmountContent">100.00</number>
<string key="AmountCurrencyIdentifier">CAD</string>
</map>
</array>
<array key="Item">
<map>
<array key="Description">
<map>
<string key="TextContent">Cotter pin, MIL-SPEC</string>
</map>
</array>
</map>
</array>
</map>
</array>
</map>
</array>
</map>
将此 XML 作为参数传递是否正确?
<xsl:apply-templates select="$input-as-xml" />
拜托,关于如何使用模板转换我想要的 XML 有什么建议吗?我只是想要一些建议。
有关前缀的信息似乎没有包含在 JSON 中,所以我决定将它们声明为参数,并且我假设您知道元素的 name/key 开头 (例如 Invoice
):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="xs math fn"
version="3.0">
<xsl:param name="json-input" as="xs:string">{"_D":"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
"_S":"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2",
"_B":"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2",
"Invoice":[{
"ID":[{"IdentifierContent":"123"}],
"IssueDate":[{"DateContent":"2011-09-22"}],
"InvoicePeriod":[{
"StartDate":[{"DateContent":"2011-08-01"}],
"EndDate":[{"DateContent":"2011-08-31"}]
}],
"AccountingSupplierParty":[{
"Party":[{
"PartyName":[{
"Name":[{"TextContent":"Custom Cotter Pins"}]
}]
}]
}],
"AccountingCustomerParty":[{
"Party":[{
"PartyName":[{
"Name":[{"TextContent":"North American Veeblefetzer"}]
}]
}]
}],
"LegalMonetaryTotal":[{
"PayableAmount":[{"AmountContent":100.00,
"AmountCurrencyIdentifier":"CAD"}]
}],
"InvoiceLine":[{
"ID":[{"IdentifierContent":"1"}],
"LineExtensionAmount":[{"AmountContent":100.00,
"AmountCurrencyIdentifier":"CAD"}],
"Item":[{
"Description":[{"TextContent":"Cotter pin, MIL-SPEC"}]
}]
}]
}]}</xsl:param>
<xsl:param name="prefix2" as="xs:string" select="'cbc'"/>
<xsl:param name="prefix1" as="xs:string" select="'cac'"/>
<xsl:output indent="yes"/>
<xsl:template name="xsl:initial-template">
<xsl:apply-templates select="json-to-xml($json-input)//fn:array[@key = 'Invoice']"/>
</xsl:template>
<xsl:template match="fn:array[@key = 'Invoice']" priority="5">
<xsl:variable name="ns" select="../fn:string[@key = '_D']"/>
<xsl:variable name="ns1" select="../fn:string[@key = '_S']"/>
<xsl:variable name="ns2" select="../fn:string[@key = '_B']"/>
<xsl:element name="{@key}" namespace="{$ns}">
<xsl:namespace name="{$prefix1}" select="$ns1"/>
<xsl:namespace name="{$prefix2}" select="$ns2"/>
<xsl:apply-templates>
<xsl:with-param name="ns1" select="$ns1" tunnel="yes"/>
<xsl:with-param name="ns2" select="$ns2" tunnel="yes"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="fn:array[@key and *[1][self::fn:map[fn:string]] and not(*[2])]">
<xsl:param name="ns2" tunnel="yes"/>
<xsl:element name="{$prefix2}:{@key}" namespace="{$ns2}">
<xsl:value-of select="fn:map/fn:string"/>
</xsl:element>
</xsl:template>
<xsl:template match="fn:array[@key and fn:map[fn:array]]">
<xsl:param name="ns1" tunnel="yes"/>
<xsl:element name="{$prefix1}:{@key}" namespace="{$ns1}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
JSON 至 XML 示例:
JSON: "
"{\n" +" \"color\": \"red\",\n" +" \"value\": \"#f00\"\n" +"}";
XSLT:
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="jsonText"></xsl:param>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template name="init">
<xsl:apply-templates select="json-to-xml($jsonText)"/>
</xsl:template>
<xsl:template match="string[@key = 'subjects']" xpath-default namespace="http://www.w3.org/2005/xpath-functions"><xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:sequence select="parse-xml(.)/node()"/></xsl:copy></xsl:template</xsl:stylesheet>`
我正在使用 XSLT 3.0 通过函数 json-to-xml、
转换此文档 JSON to this document XML<xsl:variable name="input-as-xml" select="json-to-xml(.)"/>
我从撒克逊传递这个 json 像文档 XML:
String XML = "<root>" + JSON + "</root>";
我在调用函数 json-to-xml:
时得到一个 XML<?xml version="1.0" encoding="utf-8"?>
<map
xmlns="http://www.w3.org/2005/xpath-functions">
<string key="_D">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2</string>
<string key="_S">urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2</string>
<string key="_B">urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2</string>
<array key="Invoice">
<map>
<array key="ID">
<map>
<string key="IdentifierContent">123</string>
</map>
</array>
<array key="IssueDate">
<map>
<string key="DateContent">2011-09-22</string>
</map>
</array>
<array key="InvoicePeriod">
<map>
<array key="StartDate">
<map>
<string key="DateContent">2011-08-01</string>
</map>
</array>
<array key="EndDate">
<map>
<string key="DateContent">2011-08-31</string>
</map>
</array>
</map>
</array>
<array key="AccountingSupplierParty">
<map>
<array key="Party">
<map>
<array key="PartyName">
<map>
<array key="Name">
<map>
<string key="TextContent">Custom Cotter Pins</string>
</map>
</array>
</map>
</array>
</map>
</array>
</map>
</array>
<array key="AccountingCustomerParty">
<map>
<array key="Party">
<map>
<array key="PartyName">
<map>
<array key="Name">
<map>
<string key="TextContent">North American Veeblefetzer</string>
</map>
</array>
</map>
</array>
</map>
</array>
</map>
</array>
<array key="LegalMonetaryTotal">
<map>
<array key="PayableAmount">
<map>
<number key="AmountContent">100.00</number>
<string key="AmountCurrencyIdentifier">CAD</string>
</map>
</array>
</map>
</array>
<array key="InvoiceLine">
<map>
<array key="ID">
<map>
<string key="IdentifierContent">1</string>
</map>
</array>
<array key="LineExtensionAmount">
<map>
<number key="AmountContent">100.00</number>
<string key="AmountCurrencyIdentifier">CAD</string>
</map>
</array>
<array key="Item">
<map>
<array key="Description">
<map>
<string key="TextContent">Cotter pin, MIL-SPEC</string>
</map>
</array>
</map>
</array>
</map>
</array>
</map>
</array>
</map>
将此 XML 作为参数传递是否正确?
<xsl:apply-templates select="$input-as-xml" />
拜托,关于如何使用模板转换我想要的 XML 有什么建议吗?我只是想要一些建议。
有关前缀的信息似乎没有包含在 JSON 中,所以我决定将它们声明为参数,并且我假设您知道元素的 name/key 开头 (例如 Invoice
):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
exclude-result-prefixes="xs math fn"
version="3.0">
<xsl:param name="json-input" as="xs:string">{"_D":"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
"_S":"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2",
"_B":"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2",
"Invoice":[{
"ID":[{"IdentifierContent":"123"}],
"IssueDate":[{"DateContent":"2011-09-22"}],
"InvoicePeriod":[{
"StartDate":[{"DateContent":"2011-08-01"}],
"EndDate":[{"DateContent":"2011-08-31"}]
}],
"AccountingSupplierParty":[{
"Party":[{
"PartyName":[{
"Name":[{"TextContent":"Custom Cotter Pins"}]
}]
}]
}],
"AccountingCustomerParty":[{
"Party":[{
"PartyName":[{
"Name":[{"TextContent":"North American Veeblefetzer"}]
}]
}]
}],
"LegalMonetaryTotal":[{
"PayableAmount":[{"AmountContent":100.00,
"AmountCurrencyIdentifier":"CAD"}]
}],
"InvoiceLine":[{
"ID":[{"IdentifierContent":"1"}],
"LineExtensionAmount":[{"AmountContent":100.00,
"AmountCurrencyIdentifier":"CAD"}],
"Item":[{
"Description":[{"TextContent":"Cotter pin, MIL-SPEC"}]
}]
}]
}]}</xsl:param>
<xsl:param name="prefix2" as="xs:string" select="'cbc'"/>
<xsl:param name="prefix1" as="xs:string" select="'cac'"/>
<xsl:output indent="yes"/>
<xsl:template name="xsl:initial-template">
<xsl:apply-templates select="json-to-xml($json-input)//fn:array[@key = 'Invoice']"/>
</xsl:template>
<xsl:template match="fn:array[@key = 'Invoice']" priority="5">
<xsl:variable name="ns" select="../fn:string[@key = '_D']"/>
<xsl:variable name="ns1" select="../fn:string[@key = '_S']"/>
<xsl:variable name="ns2" select="../fn:string[@key = '_B']"/>
<xsl:element name="{@key}" namespace="{$ns}">
<xsl:namespace name="{$prefix1}" select="$ns1"/>
<xsl:namespace name="{$prefix2}" select="$ns2"/>
<xsl:apply-templates>
<xsl:with-param name="ns1" select="$ns1" tunnel="yes"/>
<xsl:with-param name="ns2" select="$ns2" tunnel="yes"/>
</xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="fn:array[@key and *[1][self::fn:map[fn:string]] and not(*[2])]">
<xsl:param name="ns2" tunnel="yes"/>
<xsl:element name="{$prefix2}:{@key}" namespace="{$ns2}">
<xsl:value-of select="fn:map/fn:string"/>
</xsl:element>
</xsl:template>
<xsl:template match="fn:array[@key and fn:map[fn:array]]">
<xsl:param name="ns1" tunnel="yes"/>
<xsl:element name="{$prefix1}:{@key}" namespace="{$ns1}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
JSON 至 XML 示例:
JSON: "
"{\n" +" \"color\": \"red\",\n" +" \"value\": \"#f00\"\n" +"}";
XSLT:
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="jsonText"></xsl:param>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template name="init">
<xsl:apply-templates select="json-to-xml($jsonText)"/>
</xsl:template>
<xsl:template match="string[@key = 'subjects']" xpath-default namespace="http://www.w3.org/2005/xpath-functions"><xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:sequence select="parse-xml(.)/node()"/></xsl:copy></xsl:template</xsl:stylesheet>`