使用XSLT将嵌入式JSON转换为XML
使用XSLT转换XML文档时,是否可以在转换过程中转换嵌入的JSON(即JSON格式的内容) 例如:-使用XSLT将嵌入式JSON转换为XML,json,xml,xslt,Json,Xml,Xslt,使用XSLT转换XML文档时,是否可以在转换过程中转换嵌入的JSON(即JSON格式的内容) 例如:- <form> <data>[{"id":1,"name":"Hello"},{"id":2,"name":"World"}]</data> </form> [{“id”:1,“name”:“Hello”},{“id”:2,“name”:“World”}] 将转换为:- <form> <data>
<form>
<data>[{"id":1,"name":"Hello"},{"id":2,"name":"World"}]</data>
</form>
[{“id”:1,“name”:“Hello”},{“id”:2,“name”:“World”}]
将转换为:-
<form>
<data>
<id name="Hello">1</id>
<id name="World">2</id>
</data>
</form>
1.
2.
在XSLT 3.0中应该是可能的,因为它有一个从json到xml的:
解析以JSON文本形式提供的字符串,返回
结果以XML文档节点的形式出现
您可以尝试在中的当前实现中运行它。解析JSON在XSLT 3.0中受支持,因此使用Saxon 9.7的商业版本可以使用
<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:strip-space elements="*"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="data">
<xsl:copy>
<xsl:apply-templates select="parse-json(.)?*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=".[. instance of map(xs:string, item())]">
<id name="{.?name}">
<xsl:value-of select=".?id"/>
</id>
</xsl:template>
</xsl:stylesheet>
Saxon 9.7他在Maven和上可用,谢谢,但我担心商业报价超出了我的项目范围。。我希望有一个XSLT 2.0解决方案(Oracle 11gR2数据库中受支持的版本)或一种替代方法,通过导入jar或其他任何东西来支持Oracle数据库中的XSLT 3.0。@AlbPuado,我添加了一个示例,可用于Saxon 9.7的开源HE版,它使用另一个答案中已经建议的函数json-to-xml
。至于Oracle和XSLT 2,恐怕我不熟悉它,它的特性如扩展功能,考虑用特定的标签来标记您的问题,如果您正在该环境中寻找解决方案,可能比其他熟悉它的人可以告诉您是否有扩展功能来解析和处理JSON。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
exclude-result-prefixes="xs math fn"
version="3.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="data">
<xsl:copy>
<xsl:apply-templates select="json-to-xml(.)//fn:map"/>
</xsl:copy>
</xsl:template>
<xsl:template match="fn:map">
<id name="{fn:string[@key = 'name']}">
<xsl:value-of select="fn:number[@key = 'id']"/>
</id>
</xsl:template>
</xsl:stylesheet>