2011-01-31 47 views
8

Este es mi XML.Cómo ordenar valores a través de XPath

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

La lógica es la siguiente: nodos elemento debe ser clasificados de acuerdo con val nodo y la fecha. First Order debe basarse en val y dentro de esta secuencia de nodos con valor val. Deben estar listados por fecha.

¿Alguien sabe cómo obtener una lista ordenada de nodos XML a través de XPath?

¿Alguna idea?

+0

Parece que sí XPath no soporta clasificar: https : //stackoverflow.com/questions/8480673/sort-with-xpath-not-xsl No estoy seguro de si esto es cierto para las versiones más recientes de XPath. –

Respuesta

9

Puede usar xsl:sort para ordenar los nodos coincidentes. Esto le permitirá ordenar por su elemento val. Sin embargo, XPath 1.0 no tiene un tipo de datos de fecha. Una solución razonable para este problema es dividir su fecha en sus componentes de año, mes y día, y clasificarlos individualmente. A continuación se debe hacer el truco:

<?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> 
+0

Gracias - tu respuesta eliminada también me pareció bien. La función translate() fue un poco astuta ;-) – ColinE

+0

No funcionó debido a que los números eran tan grandes como el número del día :) Empecé a escribir subcadenas, pero ya lo hizo. – Flack

+7

Si está a cargo del diseño XML (o incluso si no lo está ...) siempre es mejor mantener las fechas en formato ISO YYYY-MM-DD en lugar de dd/mm/aaaa o mm/dd/aaaa . Evita la ambigüedad para el lector humano, y es más fácil de procesar por el software. –

0

Parece que XPath 3.1 ofertas clasificar:

Firmas

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

Cuestiones relacionadas