在XSLT中有
<xsl:value-of select="expression"/>
获取元素的值,但是有什么东西可以选择元素的标记名吗?
在这种情况下:
<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>
获得这样的输出:
name : Robert profession : programmer hobby : photography
当然上面的XSLT不会编译,因为
<xsl:tag-of select="expression"/>
不存在。但是怎么办呢?
答案 0 :(得分:149)
这将为您提供当前元素名称(标记名称)
<xsl:value-of select ="name(.)"/>
OP-Edit:这也可以解决问题:
<xsl:value-of select ="local-name()"/>
答案 1 :(得分:98)
没有人确实指出函数name()
和local-name()
的语义的细微差别。
name(someNode)
返回完整
节点的名称,包括
节点的前缀和冒号
是一个元素或属性。local-name(someNode)
仅返回
节点的本地名称,以及
不包括前缀和冒号
如果节点是元素或
属性。因此,在名称可能属于两个不同名称空间的情况下,必须使用name()
函数才能仍然区分这些名称。
而且,BTW,可以在没有任何参数的情况下指定这两个函数:
name()
是 name(.)
local-name()
是 local-name(.)
最后,请记住,不仅元素和属性具有名称,这两个函数也可以在PI上使用,并且它们是相同的。)
答案 2 :(得分:14)
<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>
答案 3 :(得分:9)
对于那些感兴趣的人,没有:
<xsl:tag-of select="."/>
但是你可以通过以下方式重新创建标签/元素:
<xsl:element name="{local-name()}">
<xsl:value-of select="substring(.,1,3)"/>
</xsl:element>
这在xslt模板中很有用,例如,它处理许多不同元素的格式化数据值。当您不知道正在处理的元素的名称时,您仍然可以输出相同的元素,并在需要时修改该值。
答案 4 :(得分:6)
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>
答案 5 :(得分:0)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="person">
<xsl:for-each select="*">
<xsl:text>
</xsl:text>
<xsl:value-of select="local-name()"/> : <xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>