Как отсортировать значения через XPath - PullRequest
9 голосов
/ 31 января 2011

Это мой 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 ]

9 голосов
/ 31 января 2011

Вы можете использовать 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>
1 голос
/ 21 января 2018

Похоже, что 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...