2009-02-25 5 views
90

In XSLT c'è laEsiste un nome-elemento XSLT?

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

per ottenere il valore di un elemento, ma c'è qualcosa per selezionare il tag-nome 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 l'output simile a questo:

name : Robert 
profession : programmer 
hobby : photography 

Naturalmente quanto sopra XSLT non viene compilato perché

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

non esiste. Ma come si potrebbe fare?

+0

Il tag più pertinente 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 lingua di hosting (C#, XSLT, XQuery, ...) Per favore, re-tag –

+0

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

+0

Grazie, quelli hanno bisogno di essere riparati. –

risposta

139

Questo vi darà l'attuale nome dell'elemento (nome del tag)

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

OP-Edit: Questo sarà anche il trucco:

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

nome locale è ciò che vuoi 9 volte su 10 – annakata

+16

nome-locale è senza nome, questo è il motivo per cui di solito è meglio. –

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

Quindi, perché questo è stato votato? Certo, potrei aver menzionato il nome locale() se non volevi lo spazio dei nomi, ma sarebbe utile alla comunità più ampia per spiegare perché questo non avrebbe funzionato. –

+0

Forse non può trasformare il dato XML. il nome (.) sarà "persona" in questo caso. dovrebbe essere "nome", "professione" e "hobby". –

+0

@CodeMelt Perché non hai inoltrato la risposta accettata? È buono, ma è anche meno specifico di questo. Ho risposto alla domanda di Rowland Shaw in quanto fornisce la risposta alla domanda. Plenè, downvote solo quando un aswer contiene informazioni errate, errate o fuorvianti –

13
<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> 
+0

Come una buona pratica utilizzare sempre normalize-space() quando ottenere valore del nodo Ciò tagliare gli spazi in più –

+0

@Rashimi , grazie per questo. –

+0

Tale normalizzazione/sanificazione sarebbe necessaria solo se non fosse stata gestita nella fase di raccolta degli input. Facendolo, si risparmia dover farlo al tempo di accesso, che di solito è molto più spesso. Lo farebbe prima di aggiungere a un RDB e un documento xml è solo un altro database. – Patanjali

93

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

  • name(someNode) restituisce il pieno nome del nodo, e che include il prefisso e colon nel caso il nodo è un elemento o un attributo.
  • local-name(someNode) restituisce solo il nome locale del nodo, e che non include il prefisso e colon nel caso il nodo è un elemento o un attributo .

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

E, a proposito, è possibile specificare entrambe le funzioni, senza alcuna argomentazione:

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

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

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

7

Per chi fosse interessato, non c'è:

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

Tuttavia è possibile ricreare il tag/elemento andando:

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

Questo è utile in un modello XSLT che ad esempio le maniglie 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 produrre lo stesso elemento e modificare il valore se necessario.