Как выбрать узел из xml, созданного с помощью json-to-xml () - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь получить элемент из JSON после преобразования его в XML.

Рабочий пример: 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>

1 Ответ

2 голосов
/ 12 апреля 2019

XML, генерируемый json-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 ищет 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>
...