2011-01-31 14 views
8

Questi sono i miei XML.Come ordinare i valori tramite 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 logica è questa: nodi dell'elemento devono essere classificati in base al nodo val e la data. Il primo ordine deve essere basato su val e all'interno di questa sequenza di nodi con valore val. Dovrebbero essere elencati per data.

Qualcuno sa come ottenere un elenco ordinato di nodi XML tramite XPath?

Qualche idea?

+0

Sembra che XPath per sé non supporta l'ordinamento: https : //stackoverflow.com/questions/8480673/sort-with-xpath-not-xsl Non sono sicuro se questo è vero per le versioni più recenti di XPath. –

risposta

9

È possibile utilizzare xsl:sort per ordinare i nodi corrispondenti. Questo ti permetterà di ordinare dal tuo elemento val. Tuttavia, XPath 1.0 non ha un tipo di dati di data. Una soluzione ragionevole a questo problema è dividere la data in componenti anno, mese e giorno e ordinare individualmente. Il seguente dovrebbe fare il trucco:

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

Grazie - anche la tua risposta cancellata mi è sembrata buona. La funzione translate() era un po 'furba ;-) – ColinE

+0

Non funzionava perché i numeri erano grandi come il numero del giorno :) Ho iniziato a scrivere la sottostringa, ma l'hai già fatto. – Flack

+7

Se sei responsabile del progetto XML (o anche se non lo sei ...) è sempre meglio tenere le date in formato ISO AAAA-MM-GG anziché come gg/mm/aaaa o mm/gg/aaaa . Evita l'ambiguità per il lettore umano ed è più semplice da elaborare per il software. –

0

Sembra che XPath 3.1 offre l'ordinamento:

Firme

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

Problemi correlati