基于兄弟节点对xslt节点进行排序

时间:2013-12-12 08:52:56

标签: sorting xslt nodes

我在使用它时遇到一些麻烦,我真的需要一些帮助。 我想存储有一个非空的兄弟的最小变量。 我有一个看起来像这样的XML:

<Root>
    <Item>
         <ValueOne>5</ValueOne>
         <Item>bababa</Item>
    </Item>
    <Item>
         <ValueOne>3</ValueOne>
         <Item>ababa</Item>
    </Item>
    <Item>
         <ValueOne>1</ValueOne>
         <Item/>
    </Item>
</Root>

所以我想要最小的ValueOne兄弟项目有一个值。 我想的是:

<xsl:variable name="var">
    <xsl:for-each select="Root/Item">
         <xsl:if test="not(/Item = '')">
             <xsl:sort data-type="text"/>
             <xsl:if test="position()=1">
                 <xsl:value-of select="/Item"/>
             </xsl:if>
         </xsl:if>
    </xsl:for-each>
</xsl:variable>

但这不起作用,我不知道为什么。你可能会告诉我不是最好的xslt ... 我不能重命名xml中的任何内容或更改它的结构。

编辑:代码

1 个答案:

答案 0 :(得分:1)

假设这些空格和回报不是必需的,您可以使用:

<xsl:variable name="var">
    <xsl:for-each select="Root/Item[normalize-space(Item)]">
        <xsl:sort select="ValueOne" data-type="number" order="ascending"/>
        <xsl:if test="position()=1">
            <xsl:value-of select="normalize-space(ValueOne)"/>
        </xsl:if>
    </xsl:for-each>
</xsl:variable>

删除所有冗余空格后,可以简化为:

<xsl:variable name="var">
    <xsl:for-each select="Root/Item[Item/text()]">
        <xsl:sort select="ValueOne" data-type="number" order="ascending"/>
        <xsl:if test="position()=1">
            <xsl:value-of select="ValueOne"/>
        </xsl:if>
    </xsl:for-each>
</xsl:variable>