XSLT从xml节点解析JSONArray字符串

时间:2016-11-11 04:53:07

标签: xml xslt xslt-1.0 xslt-2.0

任何人都可以请我提供XSLT进行XML转换。

输入: -

<RootElement>
    <JSON>[{"51000510000000000008":"Registro guardado exitosamente."}]</JSON>
</RootElement>

Ouptut: -

<Root>  
    <pair>
        <key>51000510000000000008</key>
        <value>Registro guardado exitosamente.</value>
    </pair>
</Root>

2 个答案:

答案 0 :(得分:2)

在XSLT 3.0中,您可以执行以下操作:

<xsl:function name="f:process-kv-pair">
  <xsl:param name="key" as="xs:anyAtomicValue"/>
  <xsl:param name="value" as="item()*"/>
  <pair>
    <key>{$key}</key>
    <value>{$value}</value>
  </pair>
</xsl:function>

<xsl:template match="JSON">
  <xsl:for-each select="parse-json(.)?*">
    <xsl:sequence select="map:for-each-pair(., f:process-kv-pair#2)"/>
  </xsl:for-each>
</xsl:template>

准确的细节取决于您在JSON输入中可能找到的确切内容,如果它与您的示例不同。

答案 1 :(得分:1)

一个解决方案就是:

<?xml version = "1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />

  <xsl:template match="/RootElement">
    <Root>
      <pair>
        <xsl:apply-templates select="JSON" />
      </pair>
    </Root>
  </xsl:template>

  <xsl:template match="JSON">
    <xsl:variable name="inner"  select="substring-before( substring-after(.,'[{'), '}]')" />
    <xsl:variable name="sKey"   select="substring-before( $inner,':')" />
    <xsl:variable name="sValue" select="substring-after ( $inner,':')" />
    <key><xsl:value-of select="substring-before(substring-after ($sKey, '&quot;'), '&quot;')" /></key>
    <value><xsl:value-of select="substring-before(substring-after ($sValue, '&quot;'), '&quot;')" /></value>
  </xsl:template>

</xsl:stylesheet>

它封装<JSON>个节点中的所有<pair>个节点,并将JSON字符串拆分为两部分。

结果是:

<?xml version="1.0"?>
<Root>
    <pair>
        <key>51000510000000000008</key>
        <value>Registro guardado exitosamente.</value>
    </pair>
</Root>