如何从 json-to-xml() 创建的 xml 中 select 一个节点
How to select a node from an xml created by json-to-xml()
我试图在将 JSON 转换为 XML 后从中获取一个元素。
工作示例:https://xsltfiddle.liberty-development.net/gWmuiJf/1
在这个例子中,它被解析成功,但是当我想select一个带有下面代码的节点时,我无法带上我需要的数据。
<xsl:copy-of select="json-to-xml(root)//map[@key='identifier']"/>
JSON:
<root><![CDATA[{
"identifier": {
"use": "<div xmlns=\"http://www.w3.org/1999/xhtml\"> </div>"
}
}]]></root>
XSL:
<?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"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="json-to-xml(root)"/>
</xsl:template>
</xsl:stylesheet>
我想要的输出是这样的:
<map key="identifier">
<string key="use"><div xmlns="http://www.w3.org/1999/xhtml"> </div></string>
</map>
或这个
<string key="use"><div xmlns="http://www.w3.org/1999/xhtml"> </div></string>
json-to-xml
生成的 XML 有一个默认命名空间
<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="identifier">
<string key="use"><div xmlns="http://www.w3.org/1999/xhtml"> </div>
</string>
</map>
</map>
您的 XSLT 正在寻找没有名称空间的 map
。因此,您将不得不调整 xpath 以应对任何命名空间,但也使用 xsl:apply-templates
这样您就可以拥有一个从元素中删除命名空间的模板。
试试这个 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="/">
<xsl:apply-templates select="json-to-xml(root)//*:map[@key='identifier']"/>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我试图在将 JSON 转换为 XML 后从中获取一个元素。
工作示例:https://xsltfiddle.liberty-development.net/gWmuiJf/1
在这个例子中,它被解析成功,但是当我想select一个带有下面代码的节点时,我无法带上我需要的数据。
<xsl:copy-of select="json-to-xml(root)//map[@key='identifier']"/>
JSON:
<root><![CDATA[{
"identifier": {
"use": "<div xmlns=\"http://www.w3.org/1999/xhtml\"> </div>"
}
}]]></root>
XSL:
<?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"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="json-to-xml(root)"/>
</xsl:template>
</xsl:stylesheet>
我想要的输出是这样的:
<map key="identifier">
<string key="use"><div xmlns="http://www.w3.org/1999/xhtml"> </div></string>
</map>
或这个
<string key="use"><div xmlns="http://www.w3.org/1999/xhtml"> </div></string>
json-to-xml
生成的 XML 有一个默认命名空间
<map xmlns="http://www.w3.org/2005/xpath-functions">
<map key="identifier">
<string key="use"><div xmlns="http://www.w3.org/1999/xhtml"> </div>
</string>
</map>
</map>
您的 XSLT 正在寻找没有名称空间的 map
。因此,您将不得不调整 xpath 以应对任何命名空间,但也使用 xsl:apply-templates
这样您就可以拥有一个从元素中删除命名空间的模板。
试试这个 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="3.0">
<xsl:output indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="/">
<xsl:apply-templates select="json-to-xml(root)//*:map[@key='identifier']"/>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>