如何从json-to-xml()创建的xml中选择节点

时间:2019-04-12 12:42:54

标签: json xml xslt xslt-3.0

我试图在将JSON元素转换为XML之后。

工作示例:https://xsltfiddle.liberty-development.net/gWmuiJf/1

在此示例中,它已成功解析,但是当我想用下面的代码选择一个节点时,无法提供所需的数据。

<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">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;</string>
   </map>

或这个

 <string key="use">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt;</string>

1 个答案:

答案 0 :(得分:3)

json-to-xml生成的XML具有默认的命名空间

<map xmlns="http://www.w3.org/2005/xpath-functions">
  <map key="identifier">
    <string key="use">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt; &lt;/div&gt; 
    </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>