如何按Maps中Code顺序获取XML对应Description值?
按Maps的Code顺序匹配Details中的Description值(XSL解决方案)
问题场景
输入XML的<Group>节点包含<Maps>和<Details>子节点:
<Maps>下的<Map>节点已按Code值[20000,30000,40000,50000]排序<Details>下的<Detail>节点顺序与<Maps>的Code顺序不一致,需按<Maps>的顺序提取对应<Description>值
示例输入XML:
<Group> <Maps> <Map><Code>20000</Code></Map> <Map><Code>30000</Code></Map> <Map><Code>40000</Code></Map> <Map><Code>50000</Code></Map> </Maps> <Details> <Detail><Code>30000</Code><Description>描述B</Description></Detail> <Detail><Code>20000</Code><Description>描述A</Description></Detail> <Detail><Code>50000</Code><Description>描述D</Description></Detail> <Detail><Code>40000</Code><Description>描述C</Description></Detail> </Details> </Group>
解决方案:使用XSLT键(Key)实现精准匹配
核心思路是通过<xsl:key>建立Code到<Detail>节点的索引,遍历已排序的<Map>节点时,通过索引快速定位对应<Detail>的<Description>。
完整XSL代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 建立Code与Detail节点的映射索引 --> <xsl:key name="detail-by-code" match="Detail" use="Code"/> <xsl:template match="/Group"> <result> <!-- 按Maps的原有顺序遍历Map节点 --> <xsl:for-each select="Maps/Map"> <entry> <Code><xsl:value-of select="Code"/></Code> <!-- 通过key查找对应Code的Description --> <Description> <xsl:value-of select="key('detail-by-code', Code)/Description"/> </Description> </entry> </xsl:for-each> </result> </xsl:template> </xsl:stylesheet>
代码说明
- 索引建立:
<xsl:key>定义了以Code值为键的索引,将所有<Detail>节点按Code分组,确保通过Code能直接定位到对应的<Detail>。 - 顺序保持:遍历
<Maps>下的<Map>节点时,完全遵循其已有的排序,避免重新排序操作。 - 高效匹配:使用
key()函数查找对应<Detail>,比循环遍历<Details>节点的效率更高,尤其在节点数量较多时。
转换后输出
<result> <entry> <Code>20000</Code> <Description>描述A</Description> </entry> <entry> <Code>30000</Code> <Description>描述B</Description> </entry> <entry> <Code>40000</Code> <Description>描述C</Description> </entry> <entry> <Code>50000</Code> <Description>描述D</Description> </entry> </result>
内容的提问来源于stack exchange,提问作者User501
相关产品推荐
相关产品推荐

