2010-04-29 21 views
5

Ho qualche xml che voglio elaborare usando xslt. Una buona quantità di dati arriva attraverso coppie di valori chiave (vedi sotto). Sono alle prese con come estrarre il valore di base sulla chiave in una variabile. Vorrei essere in grado di fare qualcosa del genere:Come posso ottenere un valore da una coppia chiave/valore xml con xpath nel mio xslt?

<xsl:variable name="foo" select="/root/entry[key = 'foo']/value"/> 

ma quello non sembra funzionare. Ecco un esempio di xml.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<root> 
    <entry> 
    <key> 
     foo 
    </key> 
    <value> 
     bar 
    </value> 
    </entry> 
</root> 

Quale sarebbe il corretto xpath essere per questo?

+0

Buona domanda (+1). Sapevi che la risposta che hai selezionato non è generalmente corretta? Vedi la mia risposta per una spiegazione e per due soluzioni vere. :) –

risposta

5

Il seguente la trasformazione mostra due modi per ottenere questo - con e senza l'uso di <xsl:key> e la funzione key():

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 

<xsl:key name="kValueByKey" 
    match="value" use="normalize-space(../key)"/> 

<xsl:template match="/"> 
    1. By key: <xsl:text/> 

    <xsl:copy-of select="key('kValueByKey', 'foo')"/> 

    2. Not using key: <xsl:text/> 

    <xsl:copy-of select="/*/*[normalize-space(key)='foo']/value"/> 
</xsl:template> 
</xsl:stylesheet> 

Fare notare l'utilizzo della funzionenormalize-space() spogliare qualsiasi iniziali o finali caratteri di spaziatura dal valore di <key>.

+0

sembra essere il migliore di entrambi i mondi, corretto? – TahoeWolverine

+0

@TahoeWolverine: in puro XPath uno * ha * per usare questa espressione. Ogni volta che XPath è ospitato da XSLT preferisco sempre usare le chiavi - non è evidente come l'espressione chiave sia più semplice della "pura" XPath? Un altro argomento molto forte a favore delle chiavi è che nella maggior parte dei casi l'uso delle chiavi è più veloce di molti fattori di magnitudine. –

+0

Sì, lo vedo ora. Ero un po 'confuso perché non vedevo dove stavi definendo le variabili. Una volta che ho iniziato a creare le variabili in questo modo, le cose sono diventate un po 'più pulite. Grazie. – TahoeWolverine

4

tuo XPath funziona bene per le seguenti (equivalente) documento:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<root> 
<entry> 
    <key>foo</key> 
    <value> 
    bar 
    </value> 
</entry> 
</root> 

È possibile utilizzare la funzione XPath contains per ottenere lo stesso risultato senza ristrutturazione tuo XML:

<xsl:variable name="foo" select="/root/entry[contains(key,'foo')]/value"/> 
+0

Avrei dovuto sapere che sarebbe stato qualcosa del genere. Sfortunatamente spiegare la modifica xml alle persone che creano l'xml sarebbe eccessivamente difficile. Userò xpath. Molte grazie. – TahoeWolverine

+0

Soluzione molto semplice, ma se nel tuo XML era 'fooz', allora contiene ancora 'foo', e avrai una corrispondenza sbagliata. – derloopkat

2
<xsl:variable name="foo" select="/root/entry[key='foo']/value" /> 

Questa è una corrispondenza esatta in modo assicurarsi non ci sono spazi di ricambio o di nuova riga intorno foo in XML. Altrimenti use replace function e un'espressione regolare per tagliarli.

Problemi correlati