遍历XML文件并仅选择特定的节点

时间:2019-06-06 10:15:56

标签: xslt

我有以下要通过XSLT转换的JSON文件。

[
    {
    "firstName": "John",
    "lastName": "Andy",
    "age": "15"
    },
    {
    "firstName": "Ann",
    "lastName": "Heather",
    "age": "13"
    }

] 

,结果如下:

[
    {
    "firstName": "John",
    "lastName": "Andy"
    },
    {
    "firstName": "Ann",
    "lastName": "Heather"
    }

]

我要做的是将JSON转换为XML,然后使用以下代码处理文件:

<xsl:param name="json" as="xs:string">
     <xsl:template match="/*" name="xsl:initial-template">
            <xsl:variable name="input-as-xml"  select="json-to-xml($json)"/>     
            <xsl:variable name="transformed-xml" as="element(array)">
                <array xmlns="http://www.w3.org/2005/xpath-functions">
                    <xsl:for-each select="/node()">
                        <map xmlns="http://www.w3.org/2005/xpath-functions">
                            <string key="firstName">
                                <xsl:value-of select="$input-as-xml//string[@key='firstName']"/>
                            </string>
                            <string key="lastName">
                                <xsl:value-of select="$input-as-xml//string[@key='lastName']"/>
                            </string>
                        </map>
                    </xsl:for-each>
                </array>
            </xsl:variable>
            <xsl:value-of select="xml-to-json($transformed-xml)"/>
        </xsl:template>

使用上述代码的输出是:

[
    {
        "firstName": "John Ann John Ann",
        "lastName": "Andy Heather Andy Heather"
    }
]

我需要一些帮助来更改代码,以所需的方式检索所需的信息。

2 个答案:

答案 0 :(得分:0)

您的xsl:for-each未正确设置上下文。我想您可能想要:

    <xsl:for-each select="$input-as-xml/*/*">
        <map xmlns="http://www.w3.org/2005/xpath-functions">
           <string key="firstName">
              <xsl:value-of select="string[@key='firstName']"/>
           </string>
           <string key="lastName">
              <xsl:value-of select="string[@key='lastName']"/>
          </string>
        </map>
   </xsl:for-each>

但是我认为您可以使用xsl:copy-of:

简化它
    <xsl:for-each select="$input-as-xml/*/*">
        <map xmlns="http://www.w3.org/2005/xpath-functions">
           <xsl:copy-of select="*[@key=('firstName', 'lastName')]"/>
        </map>
   </xsl:for-each>

答案 1 :(得分:0)

我强烈建议您使用上一个问题的答案中建议的方法,即通过模板推送json-to-xml结果,这样您只需要一个空模板即可删除{{1 }}:

age

https://xsltfiddle.liberty-development.net/bnnZWD/11