Как сортировать значения через XPath

Это мой 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 и датой. Первый порядок должен быть основан на val и в этой последовательности узлов со значением val. Они должны быть перечислены по дате.

кто-нибудь знает, как получить отсортированный список узлов XML через XPath?

какие идеи?

2 ответов


можно использовать 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>

Кажется, что 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