webentwicklung-frage-antwort-db.com.de

Gibt es einen XSLT-Elementnamen?

In XSLT gibt es die

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

um den Wert eines Elements zu erhalten, aber gibt es etwas, um den Tag-Namen des Elements auszuwählen?

In einer Situation wie dieser:

<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>

So erhalten Sie eine Ausgabe wie folgt:

name : Robert
profession : programmer
hobby : photography

Natürlich wird das obige XSLT nicht kompiliert, weil

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

existiert nicht. Aber wie könnte das gemacht werden?

96
Robert Gould

Dies gibt Ihnen den aktuellen Elementnamen (Tag-Namen)

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

OP-Edit: Dies erledigt auch den Trick:

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

Niemand hat auf den subtilen Unterschied in der Semantik der Funktionen hingewiesen name() und local-name() .

  • name(someNode) gibt den vollständigen Namen des Knotens zurück, einschließlich Präfix und Doppelpunkt, falls der Knoten ein Element oder ein Attribut ist.
  • local-name(someNode) gibt nur den lokalen Namen des Knotens zurück und schließt das Präfix und den Doppelpunkt nicht ein, falls der Knoten ein Element oder ein Attribut ist.

Daher muss in Situationen, in denen ein Name zu zwei verschiedenen Namespaces gehören kann, die Funktion name() verwendet werden, damit diese Namen noch unterschieden werden können.

Und übrigens ist es möglich, beide Funktionen ohne Argument anzugeben :

name() ist eine Abkürzung für name(.)

local-name() ist eine Abkürzung für local-name(.)

Schließlich , denken Sie daran, dass nicht nur Elemente und Attribute Namen haben, diese beiden Funktionen können auch auf PIs verwendet werden und auf diesen sind sie identisch).

99
<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>
14
Ray Lu

Für Interessierte gibt es keine:

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

Sie können das Tag/Element jedoch neu erstellen, indem Sie folgendermaßen vorgehen:

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

Dies ist in einer xslt-Vorlage nützlich, die beispielsweise das Formatieren von Datenwerten für viele verschiedene Elemente handhabt. Wenn Sie den Namen des Elements, an dem gearbeitet wird, nicht kennen und dennoch dasselbe Element ausgeben und den Wert gegebenenfalls ändern können.

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