如何从 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">&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>

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>