XPath根据值获取子节点

时间:2018-08-06 09:13:18

标签: xml xslt xpath

我有以下输入内容

     <LOV_List>
            <LOV>

                <DisplayValue>...</DisplayValue>
                <Code>15</Code>

            </LOV>
            <LOV>
                <DisplayValue>...</DisplayValue>
                <Code>15</Code>
            </LOV>

                       ...

      <LOV_List>

我正在尝试获得以下输出

      <List>
            <values>
                <Id>1</Id>
                <DisplayValue1>...</DisplayValue1>
                <DisplayValue2>..</DisplayValue2>
            <values>
    </List>

但是为了得到它,我需要比较<Code>的值。如果该值与我需要返回的节点的DisplayValues相同。 我是新来的,所以请给我一些指示。

1 个答案:

答案 0 :(得分:1)

这是一种分组的情况,由于您使用的是XSLT 1.0,因此必须使用muenchian grouping才能获得所需的输出。

定义一个键,以使用Code的值对元素进行分组。

<xsl:key name="kCode" match="LOV" use="Code" />

使用其ID和键匹配分组的元素。

<xsl:template match="LOV[generate-id() = generate-id(key('kCode', Code)[1])]">
    <values>
        <Id><xsl:number format="1" /></Id>
        <xsl:for-each select="key('kCode', Code)">
            <DisplayValue>
                <xsl:value-of select="DisplayValue" />
            </DisplayValue>
        </xsl:for-each>
    </values>
</xsl:template>

完整的XSLT如下

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" />
    <xsl:strip-space elements="*" />

    <xsl:key name="kCode" match="LOV" use="Code" />

    <xsl:template match="LOV_List">
        <List>
            <xsl:apply-templates />
        </List>
    </xsl:template>

    <xsl:template match="LOV[generate-id() = generate-id(key('kCode', Code)[1])]">
        <values>
            <Id><xsl:number format="1" /></Id>
            <xsl:for-each select="key('kCode', Code)">
                <xsl:copy-of select="DisplayValue" />
            </xsl:for-each>
        </values>
    </xsl:template>
    <xsl:template match="LOV" />
</xsl:stylesheet>

输出

<List>
    <values>
        <Id>1</Id>
        <DisplayValue>..</DisplayValue>
        <DisplayValue>....</DisplayValue>
    </values>
</List>