【问题标题】:Selecting the min/max value of an attribute under multiple nodes in XPath 1.0在 XPath 1.0 中选择多个节点下属性的最小值/最大值
【发布时间】:2014-04-28 19:48:34
【问题描述】:

考虑以下 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

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

非常感谢任何帮助!

谢谢, J

【问题讨论】:

  • 如果您只是出于好奇而这样做,那很好,但我强烈建议您不要使用 XPath 来执行此操作,因为它在代码可读性方面的得分非常低。
  • 谢谢,我只是看看我可以在 XPath 中做些什么,因为我试图在单个 XSLT 中提供我的解决方案,然后将用于以可读格式显示 XML .我想这也不是很好的表现,考虑到可能有 100 个@x!?

标签: xml xpath


【解决方案1】:

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

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

对于最小值,只需将&lt; 替换为&gt;

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

【讨论】:

  • 哇,比我想象的还要简单,谢谢!是的,不幸的是我正在使用 XPath 1.0。
  • 这在@x 是整数时效果很好,但现在我有另一个属性,它包含一个表示日期的字符串,格式为 YYYY-MM。我想得到最早的年份。我尝试将 number(substring(.,1,4)) 包裹在属性周围,但没有骰子。对于这种情况有什么想法吗?
【解决方案2】:

我解决了类似的问题,我在单个嵌套的 for-each 循环中处理了 &lt;b&gt;&lt;c&gt; 元素,我想获取 &lt;d&gt;content 最大 @ 的第一个元素每个部分中的 987654324@ 值。我使用了以下代码:

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多