首页 > 解决方案 > 如何从 json-to-xml() 创建的 xml 中选择一个节点

问题描述

在将它转换为 XML 之后,我试图从 JSON 中获取一个元素。

工作示例: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>

标签: jsonxmlxsltxslt-3.0

解决方案


生成的 XMLjson-to-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 正在寻找一个mapin no namespace。因此,您将不得不调整 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>

推荐阅读