【问题标题】:XSLT 3.0 json-to-xml() not working with valid jsonXSLT 3.0 json-to-xml() 不能使用有效的 json
【发布时间】:2018-06-11 11:29:40
【问题描述】:

下面的 json 是一个有效的 Json。但是 XSLT 3.0 转换 json-to-xml() 不起作用,并且在 json 语法中显示一些错误。

{
    "identifier": {
        "use": "<div xmlns=\"http://www.w3.org/1999/xhtml\"> </div>"
    }
}

我该怎么做才能让它发挥作用。我认为一些与转义字符相关的事情需要在这里完成。任何关于此的指针都会有很大的帮助。

尝试在此位置执行代码Fiddler

【问题讨论】:

    标签: json xml xslt


    【解决方案1】:

    您正在尝试将带有 XML 的 JSON 放入 XML 输入文档中,这会导致 XML 解析器尝试解析您放入小提琴中的输入时出现问题,如果您对样式表使用字符串参数,如在https://xsltfiddle.liberty-development.net/gWmuiJf 完成,你会得到 ​​p>

    <?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:param name="json-input" as="xs:string"><![CDATA[{
                "identifier": {
                    "use": "<div xmlns=\"http://www.w3.org/1999/xhtml\"> </div>"
                    }
            }]]></xsl:param>
    
    
      <xsl:template match="/">
        <xsl:copy-of select="json-to-xml($json-input)"/>
      </xsl:template>
    
    </xsl:stylesheet>
    

    输出是

    <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>
    

    您也可以在主要 XML 输入中使用相同的 CDATA 转义,即使用

    <root><![CDATA[{
                "identifier": {
                    "use": "<div xmlns=\"http://www.w3.org/1999/xhtml\"> </div>"
                    }
            }]]></root>
    

    作为 XML 输入,然后

    <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>
    

    作为 XSLT,就像在 https://xsltfiddle.liberty-development.net/gWmuiJf/1 中所做的那样,您会得到与上面相同的结果。

    【讨论】:

      【解决方案2】:

      在你指向的“fiddler”中,你有一个 XML 文件:

      <data>{
                  "identifier": {
                      "use": "<div xmlns=\"http://www.w3.org/1999/xhtml\"> </div>"
                      }
              }
      </data>
      

      问题在于这是无效的 XML。 XML 解析器看到一个开始标记 &lt;data&gt;,然后是一个文本节点,然后是一个开始标记 &lt;div xmlns=\,并抱怨因为xmlns= 之后的第一个字符必须是 " 而不是 \

      因此,您将 XML 嵌套在 JSON 中嵌套在 XML 中。当您在 JSON 中嵌套 XML 时,您必须将 " 转义为 \",您已经这样做了;但是当您在 XML 中嵌套 JSON 时,您必须将 &amp;lt; 转义为 &amp;lt;,您还没有这样做。最简单的解决方案可能是使用 CDATA 部分:

      <data><![CDATA[{
                  "identifier": {
                      "use": "<div xmlns=\"http://www.w3.org/1999/xhtml\"> </div>"
                      }
              }
      ]]></data>
      

      【讨论】:

        猜你喜欢
        • 2018-08-03
        • 2019-09-09
        • 2021-10-17
        • 2021-11-08
        • 2019-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        相关资源
        最近更新 更多