在XPath 1.0中的多个节点下选择属性的最小/最大值

时间:2013-02-27 16:51:39

标签: xml xpath

考虑以下XML结构:

<a>
<b>
    <c>
        <d x="1"/>
        <d x="2"/>
        <d x="3"/>
        <d x="3"/>
        <d x="4"/>
    </c>
</b>
<b>
    <c>
        <d x="1"/>
        <d x="1"/>
        <d x="2"/>
        <d x="3"/>
        <d x="4"/>
        <d x="5"/>
        <d x="5"/>
    </c>
</b>
<b>
    <c>
        <d x="1"/>
        <d x="2"/>
        <d x="3"/>
        <d x="3"/>
        <d x="4"/>
        <d x="5"/>
        <d x="5"/>
    </c>
</b>

我想要一个XPath 1.0语句来给我@x的最小值和最大值?到目前为止,我有以下最低要求:

// a / b / c / d [not(preceding-sibling :: d / @ x&lt; = @x)而不是(follow-sibling :: d / @ x&lt; = @x)] / @x

这很近,但没有雪茄: - (

任何帮助都非常感谢!

谢谢, Ĵ

2 个答案:

答案 0 :(得分:10)

要获取最大值,请查找不存在较小值的所有属性值。如果有多个结果,请选择第一个结果 - 它们必须相等。

(//@x[not(. < //@x)])[1]

要获得最小值,只需将<替换为>

出于完整性原因:如果您的XPath引擎支持XPath 2.0(或更好),请使用max(//@x)尊重min(//@x),这可能会更快,更易读。

答案 1 :(得分:0)

我解决了类似的问题,我在每个周期的单个嵌套中处理了<b><c>元素,我希望获得<d>内容每个部分中具有最大x值的第一个元素。我使用了以下代码:

<xsl:for-each select="/a/b">
  <!-- do something -->
  <xsl:for-each select="./c">
    <!-- do something -->
    <xsl:value-of select="((./d/@x[not(. &lt; ../../d/@x)])[1])/../." /> 
  </xsl:for-each>
</xsl:for-each>