考虑以下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
这很近,但没有雪茄: - (
任何帮助都非常感谢!
谢谢, Ĵ
答案 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(. < ../../d/@x)])[1])/../." />
</xsl:for-each>
</xsl:for-each>