Czy istnieje Nazwa elementu XSLT?

W XSLT jest

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

Aby uzyskać wartość elementu, ale czy jest coś, aby wybrać nazwę znacznika elementu?

W takiej sytuacji:

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

Aby uzyskać wynik w ten sposób:

name : Robert
profession : programmer
hobby : photography

Oczywiście powyższy XSLT nie będzie kompilowany ponieważ

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

Nie istnieje. Ale jak można to zrobić?

Author: Dimitre Novatchev, 2009-02-25

5 answers

To da ci bieżącą nazwę elementu (nazwę znacznika)

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

OP-Edit: to też załatwi sprawę:

<xsl:value-of select ="local-name()"/>
 144
Author: Rashmi Pandit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-25 09:22:10

Nikt nie wskazał subtelnej różnicy w semantyce funkcji name() oraz local-name().

  • name(someNode) zwraca pełną nazwa węzła, która obejmuje przedrostek i dwukropek w przypadku węzła jest elementem lub atrybutem.
  • local-name(someNode) zwraca tylko lokalnej nazwy węzła, oraz że nie zawiera przedrostka i dwukropka w przypadku gdy węzeł jest elementem lub atrybut.

Dlatego w sytuacjach, w których nazwa może należą do dwóch różnych przestrzeni nazw, należy użyć funkcji name(), aby te nazwy były nadal rozróżniane.

I, BTW, można określić obie funkcje bez żadnego argumentu :

name() jest skrótem od name(.)

local-name() jest skrótem od local-name(.)

Na koniec , pamiętaj, że nie tylko elementy i atrybuty mają nazwy, te dwie funkcje mogą być również używane na PIs i na nich są identyczne).

 95
Author: Dimitre Novatchev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-25 14:53:17
<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>
 13
Author: Ray Lu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-30 13:09:24

Dla zainteresowanych nie ma:

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

Można jednak ponownie utworzyć tag / element, wybierając:

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

Jest to przydatne w szablonie xslt, który na przykład obsługuje formatowanie wartości danych dla wielu różnych elementów. Jeśli nie znasz nazwy elementu, nad którym pracujesz i nadal możesz wypisać ten sam element i zmodyfikować wartość, jeśli zajdzie taka potrzeba.

 8
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-19 04:21:01
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>
 6
Author: Rowland Shaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-30 13:09:50