2012-11-02 16 views
5

Ho seguente domanda relativa al XPATH1 e XPATH2:XPath 1 e XPath 2 di ritorno risultati diversi quando si determina valori minimi e massimi

<document> 
    <val>3</val> 
    <val>11</val> 
    <val>3</val> 
    <val>2</val> 
    <val>12</val> 
    <val>5</val> 
    <val>0</val> 
    <val>7</val> 
</document> 

xpath1: max

//val[not(. < //val)] 

min:

//val[not(. > //val)] 

xpath2:

document/val[. = max(//val)] 

document/val[. = min(//val)] 

Perché non ottengo lo stesso risultato nella lavorazione XPATH2 con la query xpath1-max:

//val[not(. < //val)] 

Sembra che ottengo il nodo LAST (con val 7), ma non il valore più alto. .. il contrario per il valore MIN funziona bene con l'elaborazione XPATH2:

//val[not(. > //val)] 

qualcuno mi può aiutare là fuori?

risposta

5

Ottimo punto.

In xpath 1 (e xslt 1.0), //val[not(. < //val)] trasmette i valori di testo ai numeri e esegue il confronto sui numeri.

Quindi, si ottiene il valore minimo e massimo corretti.

Tuttavia, in xpath 2 (e xslt 2.0), il testo non viene convertito in numerico e viene eseguito un confronto tra stringhe. Quindi, usando il confronto delle stringhe, '7' è> '12' e quindi 7 sarà ancora il valore più alto (non restituirà solo l'ultimo valore nell'elenco - prova a scambiare l'ordine dei valori intorno)

si dovrebbe fare per essere sicuri sia in xslt 1 che in 2 è usare lo number() function per eseguire il cast sul testo, per assicurarsi che sia eseguito un confronto numerico.

Max:

//val[not(number(.) &lt; //val)] 

Min:

//val[not(number(.) &gt; //val)] 

Utilizzando sassone con il foglio di stile:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <x> 
      <Max1> 
       <xsl:value-of select="//val[not(number(.) &lt; //val)]" /> 
      </Max1> 
      <Min1> 
       <xsl:value-of select="//val[not(number(.) &gt; //val)]" /> 
      </Min1> 
      <Max2> 
       <xsl:value-of select="/document/val[. = max(//val/text())]" /> 
      </Max2> 
      <Min2> 
       <xsl:value-of select="/document/val[. = min(//val/text())]" /> 
      </Min2> 
     </x> 
    </xsl:template> 
</xsl:stylesheet> 

Returns

<x> 
    <Max1>12</Max1> 
    <Min1>0</Min1> 
    <Max2>12</Max2> 
    <Min2>0</Min2> 
</x> 

come previsto.

+2

wow, spiegazione molto bella; grazie mille, questo mi aiuta! – Fl0R1D3R