2012-06-11 22 views
13

mi è stato dato il seguente codice XML:elemento XML ha spazio dei nomi, il mio XPATH non funziona

<root> 
    <items> 
    <item> 
     <title>Item</title> 
     <details> 
     <data xmlns="http://some_url"> 
      <length>10</length> 
      <weight>1.2</weight> 
     </data> 
     </details> 
    </item> 
    </items> 
</root> 

seguito XPath non funziona significa nulla è stampata come l'elemento "Dati" non esiste:

/root/items/item/details/data 

Ma quando rimuovo l'attributo dello spazio dei nomi "xmlns" dell'elemento "data", il suo contenuto viene stampato. Come dovrebbe sembrare che l'espressione xpath funzioni senza eliminare l'attributo dello spazio dei nomi "xmlns" dell'elemento "data"?

Sto usando SAXON e XSL 1.0.

+0

è necessario registrare lo spazio dei nomi con il XPath e ngine, quindi usa l'alias registrato nel tuo XPath: 'alias: data/alias: length'. Non possiamo essere più specifici di questo senza sapere cosa stai usando per valutare l'XPath. –

risposta

13

Questo è uno dei la più FAQ in XPath/XSLT:

XPath interpreta un nome di elemento senza prefisso come appartenenti a "no namespace" e questo è il motivo per cui gli elementi con nomi senza prefisso appartenenti a un (non vuoto) namespace di default non vengono selezionati quando solo il loro il nome non prefisso viene specificato come test del nodo in un'espressione XPath.

La soluzione è o:

  1. Creare uno spazio dei nomi vincolante in cui un prefisso (diciamo "x") è associato con lo spazio dei nomi di default, quindi specificare x:elementName invece di elementName.

  2. utilizzare le espressioni lunghe, brutte e inaffidabili come: *[name() = 'elementName']

Qui è una trasformazione XSLT utilizzando il Method1 sopra. :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:a="http://some_url"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "/root/items/item/details/a:data/a:weight"/> 
</xsl:template> 
</xsl:stylesheet> 

Quando questa trasformazione viene applicata (utilizzando Saxon 6.5.4 o altro XSLT conforme qualsiasi processore 1.0) sul documento XML fornito:

<root> 
    <items> 
     <item> 
      <title>Item</title> 
      <details> 
       <data xmlns="http://some_url"> 
        <length>10</length> 
        <weight>1.2</weight> 
       </data> 
      </details> 
     </item> 
    </items> 
</root> 

viene selezionato il nodo corretto/wanted e il suo valore stringa viene copiato all'uscita:

1.2 
0

In XPath, è necessario assegnare un prefisso allo spazio dei nomi. Come si fa che dipende dal XPath software/libreria che si sta utilizzando, ma supponendo che si associa lo spazio dei nomi URI http://some_url con il prefisso dello spazio dei nomi someUrl, è possibile modificare la vostra espressione XPath come segue:

/root/items/item/details/someUrl:data 
+0

Grazie per la risposta. Sto usando SAXON e XSL 1.0. Ho provato a interrogare xpath "/ root/items/item/details/a: data" e ha stampato tutto il contenuto dell'elemento "data". Quando ho interrogato "/ root/items/item/details/a: data/a: weight" mi aspettavo che "1.2" venisse stampato, ma ha nuovamente stampato tutto il contenuto dell'elemento "data". Potresti consigliare cosa sto sbagliando? – Vojtech

+0

Come stai usando XSL, potresti mostrare il tuo foglio di stile XSL completo? (o almeno una versione minimizzata che è ragionevolmente completa?) –

Problemi correlati