XSLT:如何获取所有节点的名称?

问题描述:

我正在寻找一个样式表,它打印每个节点的名称,包括它的值。获取价值很简单,但我不知道如何获取每个节点的名称。这里的基本模板:XSLT:如何获取所有节点的名称?

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" encoding="UTF-8" /> 
    <xsl:template match="/"> 
     <xsl:for-each select="/"> 
     ??? 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

任何人都可以给我一个提示吗?

谢谢, 罗伯特

+0

问得好,+1。请参阅我的答案以获得完整的,非常简短的解决方案:) – 2011-04-04 13:06:14

+0

只有三种节点类型的名称:元素,属性和命名空间节点。 – 2011-04-04 13:38:48

这完全转变

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:variable name="vQ">"</xsl:variable> 

<xsl:template match="*"> 
    <xsl:value-of select= 
     "concat(name(), ' = ', $vQ, ., $vQ, '&#xA;')"/> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 
</xsl:stylesheet> 

当任何XML文档应用,比如这个

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

正好产生想要的,正确的结果:

nums = "01020304050607080910" 
num = "01" 
num = "02" 
num = "03" 
num = "04" 
num = "05" 
num = "06" 
num = "07" 
num = "08" 
num = "09" 
num = "10" 

Name(),“返回当前节点的名称,或在指定的节点集中的第一个节点”

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

此外,

local-name() - “返回指定节点集中当前节点或第一个节点的名称 - 不带名称空间前缀”

我想你想这样,

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

我不知道你真正想要的,但如果我把你的要求,从字面上看,它是由满足:

<xsl:for-each select="//node()"> 
    <node name="{name()}" value="{string(.)}"/> 
</xsl:for-each> 

尝试:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text" encoding="UTF-8"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="//*"> 
      <xsl:value-of select="local-name()"/>=<xsl:apply-templates select="current()/text()"/> 
      <xsl:text>&#xa;</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet>