XSLT 3.0 json-to-xml()无法使用有效的json

时间:2018-06-11 11:29:41

标签: json xml xslt

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

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

我能做些什么才能让它发挥作用。我认为与逃避角色相关的一些事情需要在这里完成。任何关于此的指针都会有很大的帮助。

尝试在此位置执行代码Fiddler

2 个答案:

答案 0 :(得分:3)

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

<?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中所做的那样,你得到与上面相同的结果。

答案 1 :(得分:3)

在&#34; fiddler&#34;你指出,你有一个XML文件:

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

问题是这是无效的XML。 XML解析器会看到一个开始标记<data>,后跟一个文本节点,后跟一个开始标记<div xmlns=\,然后抱怨,因为xmlns=之后的第一个字符必须是"\

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

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