Esiste un elemento name-of XSLT?


101

In XSLT c'è il file

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

per ottenere il valore di un elemento, ma c'è qualcosa per selezionare il nome del tag dell'elemento?

In una situazione come questa:

<person>
  <!-- required stuff -->
  <name>Robert</name>
  <!-- optional stuff, free form for future extension. 
       Using XMLSchema's xsd:any -->
  <profession>programmer</profession>
  <hobby>photography</hobby>
</person>

<xsl:for-each select="person">
   <xsl:tag-of select="."/> : <xsl:value-of select="."/>
</xsl:for-each>

Per ottenere un output come questo:

name : Robert
profession : programmer
hobby : photography

Ovviamente l'XSLT sopra non verrà compilato perché

 <xsl:tag-of select="expression"/>

non esiste. Ma come è possibile farlo?


Il tag più rilevante per questa domanda è XPath. Entrambe le funzioni sono funzioni standard XPath e possono essere utilizzate all'interno di un'espressione XPath nel contesto di qualsiasi linguaggio di hosting (C #, XSLT, XQuery, ...) Per favore, re-tag
Dimitre Novatchev

Questo testo: "In XSLT c'è il <xsd: value-of select =" expression "/>" - contiene un errore. Il prefisso solitamente utilizzato per le istruzioni XSLT è "xsl". Di solito quando si usa XML Schema si usa il prefisso "xsd" o "xs". Per favore Correggi.
Dimitre Novatchev

Risposte:


157

Questo ti darà il nome dell'elemento corrente (nome del tag)

<xsl:value-of select ="name(.)"/>

OP-Edit: questo farà anche il trucco:

<xsl:value-of select ="local-name()"/>

12
nome-locale è quello che vuoi 9 volte su 10
annakata

20
nome-locale è senza spazio dei nomi, ecco perché di solito è migliore.
Jon W,

102

Nessuno ha sottolineato la sottile differenza nella semantica delle funzioni name()e local-name().

  • name(someNode) restituisce il nome completo del nodo e include il prefisso e i due punti nel caso in cui il nodo sia un elemento o un attributo.
  • local-name(someNode) restituisce solo il nome locale del nodo e questo non include il prefisso e i due punti nel caso in cui il nodo sia un elemento o un attributo.

Pertanto, in situazioni in cui un nome può appartenere a due diversi spazi dei nomi, è necessario utilizzare la name()funzione affinché questi nomi siano ancora distinti.

E, a proposito, è possibile specificare entrambe le funzioni senza alcun argomento :

name() è un'abbreviazione di name(.)

local-name() è un'abbreviazione di local-name(.)

Infine , ricorda che non solo gli elementi e gli attributi hanno nomi, queste due funzioni possono essere utilizzate anche su PI e su questi sono identiche).


15
<xsl:for-each select="person">
  <xsl:for-each select="*">
    <xsl:value-of select="local-name()"/> : <xsl:value-of select="."/>
  </xsl:for-each>  
</xsl:for-each>

Come buona pratica, usa sempre normalize-space () quando ottieni il valore del nodo <xsl: value-of select = "normalize-space (.)" /> Questo ridurrà gli spazi extra
SO User

Tale normalizzazione / sanificazione sarebbe necessaria solo se non fosse stata gestita nella fase di raccolta degli input. Farlo quindi evita di doverlo fare al momento dell'accesso, che di solito è molto più spesso. Uno lo farebbe prima di aggiungerlo a un RDB e un documento xml è solo un altro database.
Patanjali

9

Per chi è interessato, non c'è:

<xsl:tag-of select="."/>

Tuttavia puoi ricreare il tag / elemento andando:

<xsl:element name="{local-name()}">
  <xsl:value-of select="substring(.,1,3)"/>
</xsl:element>

Ciò è utile in un modello xslt che ad esempio gestisce la formattazione dei valori dei dati per molti elementi diversi. Quando non si conosce il nome dell'elemento su cui si sta lavorando e si può ancora visualizzare lo stesso elemento e modificare il valore se necessario.


6
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>

Allora perché questo è stato votato? Certo, potresti aver menzionato local-name () se non volevi anche lo spazio dei nomi, ma sarebbe utile alla comunità più ampia spiegare perché questo non avrebbe funzionato.
Rowland Shaw,

Forse, non potrebbe trasformare il dato XML. il nome (.) sarà "persona" in questo caso. dovrebbe essere "nome", "professione" e "hobby".
Ray Lu

@CodeMelt Perché allora non hai votato per difetto la risposta accettata? È buono, ma è anche meno specifico di questo. Ho votato in alto la risposta di Rowland Shaw in quanto fornisce la risposta alla domanda. Si
prega di votare in negativo

4
Risolto quel piccolo dettaglio - personalmente, penso che le persone dovrebbero spiegare perché qualcosa è sottovalutato, in quanto aiuta a spiegare la conoscenza collettiva ...
Rowland Shaw

La nostra reputazione può attirare l'attenzione, ma poiché non garantisce che ciò che abbiamo pubblicato valga la pena, è la qualità del nostro contributo che conta davvero. Nessun ragionamento porta a contributi di scarsa qualità.
Patanjali
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.