【问题标题】:How to sort values via XPath如何通过 XPath 对值进行排序
【发布时间】:2018-01-21 06:07:20
【问题描述】:

这是我的 XML。

<root>

<element>
<title>Title .. </title>
<val>2</val>
<date>21/01/2011</date>
</element>

<element>
<title>Title .. </title>
<val>1</val>
<date>21/01/2011</date>
</element>

<element>
<title>Title .. </title>
<val>2</val>
<date>22/01/2011</date>
</element>

</root>

逻辑是这样的: 元素节点应根据节点 val 和 date 进行排序。 First Order 必须基于 val 并且在此节点序列中具有 val 值。它们应按日期列出。

有谁知道如何通过 XPath 获取 XML 节点的排序列表?

有什么想法吗?

【问题讨论】:

标签: xml xslt xpath


【解决方案1】:

您可以使用xsl:sort 对匹配的节点进行排序。这将允许您按 val 元素进行排序。但是,XPath 1.0 没有日期数据类型。这个问题的一个合理的解决方案是将你的日期分成它的年、月和日的组成部分,并单独排序。以下应该可以解决问题:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates>
        <xsl:sort select="val" data-type="number" order="descending"/>

        <!-- year sort -->
        <xsl:sort select="substring(date,7,4)" data-type="number" />
        <!-- month sort -->
        <xsl:sort select="substring(date,4,2)" data-type="number" />
        <!-- day sort -->
        <xsl:sort select="substring(date,1,2)" data-type="number" />        
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

  • 谢谢 - 您删除的答案对我来说也不错。 translate() 函数有点狡猾 ;-)
  • 因为数字和天数一样大,所以没用 :) 我开始写子字符串,但你已经写了。
  • 如果您负责 XML 设计(或者即使您不是...),最好将日期保存为 ISO 格式 YYYY-MM-DD 而不是 dd/mm/ yyyy 或 mm/dd/yyyy。它避免了人类读者的歧义,并且更易于软件处理。
【解决方案2】:

XPath 3.1 似乎提供了排序功能:

签名

fn:sort($input as item()*) as item()*
fn:sort($input as item()*,  
    $collation as xs:string?) as item()*
fn:sort($input as item()*,  
    $collation as xs:string?,  
    $key as function(item()) as xs:anyAtomicType*) as item()*

https://www.w3.org/TR/xpath-functions-31/#func-sort

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 2020-09-07
    • 2013-07-23
    相关资源
    最近更新 更多