如何将json生成的XML文档节点查询为XML



我希望导入要用XSLT处理的JSON数据,并获得结果XML。我确实理解;json到xml";指由其他映射、数组、键和值组成的映射的结果。我不知道应该使用什么语法来查询地图。第一步似乎总是从JSON文件中解析根级别的完整标记内容。我假设在对";json到xml";,正在对文档生成的节点执行。

在下面的例子中,我从一个具有层次结构的JSON文件开始,但最终结果应该是几乎完全平坦的。";一般的";以及";单元定义";(在JSON文件中(应用作如何转换数据的指导,例如使用哪个属性,但JSON中的键级别不应出现在XML结果中。

我已经阅读了XSL 3.0规范中的";json到xml";但是我没有找到任何针对生成的文档节点的查询的示例。https://www.w3.org/TR/xslt-30/#func-json到xml

以下代码也可在此处找到:https://xsltfiddle.liberty-development.net/jxWZS6Y/1

为了澄清这个问题:如何查询json到xml生成的映射,得到下面的"想要的结果";?

我的尝试次数:

XML数据源文件:

<data>
{
"general": {
"Language": "English",
"Country": "Sweden"
},
"units-definitions": {
"SEK": "iso4217:SEK"
}
}
</data>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
xmlns:root="http://www.example.org/1"
xmlns:flat="http://www.example.org/2"
>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="data">
<!-- New root tag name -->
<root:report>
<xsl:apply-templates select="json-to-xml(.)"/>
</root:report>
</xsl:template>

<xsl:template
match="*[@key]"
xpath-default-namespace="http://www.w3.org/2005/xpath-functions"
>
<xsl:element name="flat:{@key}">
<xsl:attribute name="contextRef">period0</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>

</xsl:stylesheet>

结果:

<!DOCTYPE HTML>
<root:report xmlns:root="http://www.example.org/1" xmlns:flat="http://www.example.org/2">
<flat:general contextRef="period0">
<flat:Language contextRef="period0">English</flat:Language>
<flat:Country contextRef="period0">Sweden</flat:Country>
</flat:general>
<flat:units-definitions contextRef="period0">
<flat:SEK contextRef="period0">iso4217:SEK</flat:SEK>
</flat:units-definitions>
</root:report>

想要的结果:

<?xml version="1.0" encoding="UTF-8"?>
<root:report
xmlns:root="http://www.example.org/1"
xmlns:flat="http://www.example.org/2"
>
<flat:Language contextRef="period0">English</base:Language>
<flat:Country contextRef="period0">Sweden</base:Country>
<flat:SEK contextRef="balance0">iso4217:SEK</base:SEK>
</root:report>

为了产生您想要的结果,我不认为我会使用json-to-xml(),我会直接处理JSON。类似于:

<xsl:template match="data">
<root:report>
<xsl:variable name="json" select="parse-json(.)"/>
<flat:Language contextRef="period0">{?general?Language}</flat:Language>
<flat:Country contextRef="period0">{?general?Country}</flat:Country>
<flat:SEK contextRef="period0">{?units-definitions?SEK}</flat:SEK>
</root:report>
</xsl:template>

我从你对@MartinHonnen的回答的评论中看到,你已经简化了实际问题,但我认为这种方法应该被证明是足够可扩展的。

如果你想压平一些结构,你通常会处理//*,或者在这种情况下只处理叶元素//*[@key and not(*)]:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:root="http://www.example.org/1"
xmlns:flat="http://www.example.org/2"
exclude-result-prefixes="xs"
expand-text="yes">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="data">
<root:report>
<xsl:apply-templates select="json-to-xml(.)//*[@key and not(*)]"/>
</root:report>
</xsl:template>

<xsl:template match="*[@key]">
<xsl:element name="flat:{@key}">
<xsl:attribute name="contextRef">period0</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新