繁体   English   中英

如何使用XPath / XSLT fn:json-to-xml

[英]How to use XPath/XSLT fn:json-to-xml

我需要将JSON字符串转换为XML字符串。 标签确实包含属性。 主题的答案中,我开始使用XSLT。

存在一个函数fn:json-to-xml 我了解它应该将JSON转换为不带属性的XML(我使用XSLT格式化)。

如何使用此功能?

因为它是在XSLT中实现的,所以我会在.xsl文件中进行猜测,但是找不到任何示例。

提前谢谢了!

该功能在XSLT 3.0,XPath 3.1和XQuery 3.1中定义。

使用它的最简单方法可能是安装Saxon-HE 9.7.0.7,然后从XQuery在命令行上运行它,如下所示:

java -cp /dddd/9.7.0.7/he/saxon9he.jar net.sf.saxon.Query -t -qs:"json-to-xml(unparsed-text('/eeee/test.json'))" -o:output.xml

这是一个简单的示例,摘自XSLT 3.0规范https://www.w3.org/TR/xslt-30/#func-json-to-xml ,示例输入可以是JSON格式的任何字符串,在下面使用包含带有JSON data元素的XML文档:

<root>
    <data>{
        "desc"    : "Distances between several cities, in kilometers.",
        "updated" : "2014-02-04T18:50:45",
        "uptodate": true,
        "author"  : null,
        "cities"  : {
        "Brussels": [
        {"to": "London",    "distance": 322},
        {"to": "Paris",     "distance": 265},
        {"to": "Amsterdam", "distance": 173}
        ],
        "London": [
        {"to": "Brussels",  "distance": 322},
        {"to": "Paris",     "distance": 344},
        {"to": "Amsterdam", "distance": 358}
        ],
        "Paris": [
        {"to": "Brussels",  "distance": 265},
        {"to": "London",    "distance": 344},
        {"to": "Amsterdam", "distance": 431}
        ],
        "Amsterdam": [
        {"to": "Brussels",  "distance": 173},
        {"to": "London",    "distance": 358},
        {"to": "Paris",     "distance": 431}
        ]
        }
        }</data>
</root>

data元素的模板然后简单地调用json-to-xml(.)并调用整个样式表以演示结果输出返回的XML:

<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"
    exclude-result-prefixes="xs math"
    version="3.0">

    <xsl:output indent="yes"/>

    <xsl:template match="data">
        <xsl:copy-of select="json-to-xml(.)"/>
    </xsl:template>

</xsl:stylesheet>

Saxon 9.7 HE的输出为

        <map xmlns="http://www.w3.org/2005/xpath-functions">
   <string key="desc">Distances between several cities, in kilometers.</string>
   <string key="updated">2014-02-04T18:50:45</string>
   <boolean key="uptodate">true</boolean>
   <null key="author"/>
   <map key="cities">
      <array key="Brussels">
         <map>
            <string key="to">London</string>
            <number key="distance">322</number>
         </map>
         <map>
            <string key="to">Paris</string>
            <number key="distance">265</number>
         </map>
         <map>
            <string key="to">Amsterdam</string>
            <number key="distance">173</number>
         </map>
      </array>
      <array key="London">
         <map>
            <string key="to">Brussels</string>
            <number key="distance">322</number>
         </map>
         <map>
            <string key="to">Paris</string>
            <number key="distance">344</number>
         </map>
         <map>
            <string key="to">Amsterdam</string>
            <number key="distance">358</number>
         </map>
      </array>
      <array key="Paris">
         <map>
            <string key="to">Brussels</string>
            <number key="distance">265</number>
         </map>
         <map>
            <string key="to">London</string>
            <number key="distance">344</number>
         </map>
         <map>
            <string key="to">Amsterdam</string>
            <number key="distance">431</number>
         </map>
      </array>
      <array key="Amsterdam">
         <map>
            <string key="to">Brussels</string>
            <number key="distance">173</number>
         </map>
         <map>
            <string key="to">London</string>
            <number key="distance">358</number>
         </map>
         <map>
            <string key="to">Paris</string>
            <number key="distance">431</number>
         </map>
      </array>
   </map>
</map>

因此,与将输入作为as xs:string任何其他函数一样as xs:string您当然可以传递XSLT或XPath代码中具有的任何字符串值,也可以传递一个节点,然后将该节点首先原子化为字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM