XSLT 3.0 json-to-xml () не работает с действительным json - PullRequest
0 голосов
/ 11 июня 2018

Ниже json - действительный Json.Но XSLT 3.0-преобразование json-to-xml () не работает и показывает некоторую ошибку в синтаксисе json.

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

Что я могу сделать, чтобы это работало.Я думаю, что кое-что, связанное с побегом персонажей, должно быть сделано здесь.Любой указатель на это будет очень полезен.

Попробуйте выполнить код в этом месте Fiddler

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

В «скрипаче», на который вы указываете, у вас есть файл XML:

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

Проблема в том, что это недопустимый XML.Синтаксический анализатор XML видит начальный тег <data>, за которым следует текстовый узел, за которым следует стартовый тег <div xmlns=\, и жалуется, потому что первый символ после xmlns= должен быть ", а не \.

Итак, у вас есть XML, вложенный в JSON, вложенный в XML.Когда вы вкладываете XML в JSON, вы должны экранировать " как \", что вы и сделали;но когда вы вкладываете JSON в XML, вы должны экранировать < как &lt;, чего вы еще не сделали.Самое простое решение - использовать раздел CDATA:

<data><![CDATA[{
            "identifier": {
                "use": "<div xmlns=\"http://www.w3.org/1999/xhtml\"> </div>"
                }
        }
]]></data>
0 голосов
/ 11 июня 2018

Вы пытаетесь поместить ваш JSON с XML во входной документ 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>

Вы также можете использовать тот же выход CDATAво первичном XML-вводе, то есть, используйте

<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 -развитии.net / gWmuiJf / 1 , и вы получите тот же результат, что и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...