使用 parse-json() 的 xslt 遍历器

xslt traverser using parse-json()

我这里有下面json

{
    "array1": [
        {
            "id": "banglore",
            "mappingData": [
                {
                    "name": "v1",
                    "Data": [
                        {
                            "idFromIndia": "0001"
                        }
                    ]
                },
                {
                    "name": "v2",
                    "Data": [
                        {
                            "idFromIndia": "0001"
                        },
                        {
                            "idFromIndia": "0001"
                        }
                    ]
                }
            ]
        }
    ]
}

这是我的 xslt 1st 我进入 array1 对象并再次遍历 mappingData 数组然后如果 name="v2" 遍历Data数组对象里面的数据

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    
    xmlns:array="http://www.w3.org/2005/xpath-functions/array" exclude-result-prefixes="#all"
    
    version="3.0">
    <xsl:output omit-xml-declaration="no" indent="yes"/>
    <xsl:param name="input"/>
    <xsl:variable name="newline" select="'&#10;'"/>
    <xsl:template match="/" name="xsl:initial-template">
        <xsl:variable name="input-as-map" select="parse-json($input)" as="map(*)"/>
        <root>
            <data1>
              
                <xsl:for-each select="$input-as-map?array1?*?mappingData?*[string[@key='name']/string ='v2']?Data?*">
                    <xsl:value-of select="?idFromIndia"/>
                </xsl:for-each>
                
            </data1>
        </root>
    </xsl:template>
</xsl:stylesheet>

这里在mappingData数组中当name=v2然后遍历Data数组里面的数据

任何建议也会有所帮助

我认为你基本上想要“XPath 3.1 查找路径”?array1?*?mappingData?*[?name ='v2']?Data?* 而不是你尝试过的,在你的样本中的某个地方看起来好像你在查找中间切换到使用经典XPath 路径 expressions/predicates 可以针对 JSON 的 XML 表示,但为此您需要使用 json-to-xml,显然您需要使用一致的方法。

可能不需要for-each:

<xsl:value-of select="$input-as-map?array1?*?mappingData?*[?name ='v2']?Data?*?idFromIndia"/>