从xml节点解析JSONArray字符串的XSLT

问题描述:

任何人都可以为我提供用于XML转换的XSLT。从xml节点解析JSONArray字符串的XSLT

输入: -

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

Ouptut: -

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

一个解决办法是这样的:

<?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>节点节点并将JSON字符串分成两部分。

结果是:

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

在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输入发现,如果它是从你的例子不同。