2011-08-23 3 views
5

Se ho questo XSLxsl problema namespace

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html"/> 
    <xsl:output omit-xml-declaration="yes" encoding="UTF-8"/> 

    <xsl:template match='/'> 
     <xsl:value-of select="//Description" /> 
    </xsl:template> 
</xsl:stylesheet> 

E questo XML

<ArrayOfLookupValue xmlns="http://switchwise.com.au/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <LookupValue> 
    <Description>AGL</Description> 
    <Value>8</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Australian Power &amp; Gas</Description> 
    <Value>6</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>EnergyAustralia</Description> 
    <Value>13</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Origin Energy</Description> 
    <Value>9</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>TRU Energy</Description> 
    <Value>7</Value> 
    </LookupValue> 
</ArrayOfLookupValue> 

Come posso effettivamente ottenere alcuni dati da questa linea:

<xsl:value-of select="//Description" /> 

Ho trascorso ore su questo e sono giunto alla conclusione che lo spazio dei nomi xmlns = è ciò che mi sta causando dolore.

Qualsiasi aiuto molto apprezzato.

BTW l'XML è in arrivo da un servizio Web, quindi non posso solo "cambiare" è - posso pre-elaborazione, ma che non è l'ideale ...

Inoltre mi hanno confermato che la rimozione gli spazi dei nomi da una simulazione dell'XML risolve il problema.

+0

Buona domanda, +1. Vedi la mia risposta per una spiegazione e una soluzione breve e facile. –

+0

Hai ragione che lo spazio dei nomi sta facendo la differenza. Guarda la buona spiegazione di Dimitre ... e ti risparmierai molto tempo in futuro se leggi su spazi dei nomi XML (in particolare, come usato in XPath). – LarsH

risposta

12

Questa è la maggior parte delle domande frequenti per XPath e XSLT.

La risposta breve è che in XPath un nome non prefisso è considerato appartenente a "nessun spazio dei nomi". Tuttavia, in un documento con uno spazio dei nomi predefinito i nomi non prefissati appartengono allo spazio dei nomi predefinito.

Pertanto, per tale documento l'espressione

//Description 

seleziona nulla (perché non c'è Description (o qualsiasi altro elemento) nel documento che appartiene a "namespace" - tutti gli elementi i nomi appartengono allo spazio dei nomi predefinito).

Soluzione:

Definire uno spazio dei nomi in XSLT che ha lo stesso namespace-uri() come spazio dei nomi di default del documento XML. Quindi utilizzare il prefisso del namespace modo definita per ogni nome utilizzato in un'espressione Xpath:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="http://switchwise.com.au/"> 
    <xsl:output method="html"/> 
    <xsl:output omit-xml-declaration="yes" encoding="UTF-8"/> 

    <xsl:template match='/'> 
     <xsl:copy-of select="//x:Description" /> 
    </xsl:template> 
</xsl:stylesheet> 

Quando questa trasformazione viene applicata al documento XML fornito:

<ArrayOfLookupValue xmlns="http://switchwise.com.au/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <LookupValue> 
    <Description>AGL</Description> 
    <Value>8</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Australian Power &amp; Gas</Description> 
    <Value>6</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>EnergyAustralia</Description> 
    <Value>13</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>Origin Energy</Description> 
    <Value>9</Value> 
    </LookupValue> 
    <LookupValue> 
    <Description>TRU Energy</Description> 
    <Value>7</Value> 
    </LookupValue> 
</ArrayOfLookupValue> 

la desiderata, corretta il risultato è prodotto:

<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>AGL</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>Australian Power &amp; Gas</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>EnergyAustralia</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>Origin Energy</Description> 
<Description xmlns="http://switchwise.com.au/" 
xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
>TRU Energy</Description> 
+0

+1 buona risposta. A proposito, come contrassegni una domanda come una FAQ? – LarsH

+0

@LarsH: Non penso che ci sia un modo per contrassegnare una domanda come una FAQ - al momento le FAQ sono determinate dal numero di visualizzazioni che hanno - che in realtà è "Più viste". E quello di cui abbiamo bisogno non è FAT FAQ - argomenti frequenti :) –

+0

LOL - Com'è facile quando sai come !!!Grazie mille per una risposta così semplice, facile da capire, ho inserito queste modifiche nel mio XSL e funziona come speravo. Grazie ancora!! – Rob