是否有XSLT名称元素?

时间:2009-02-25 09:11:42

标签: xml xslt xpath

在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"/>

不存在。但是怎么办呢?

6 个答案:

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