是否有XSLT名称元素?

Rob*_*uld 98 xml xslt xpath

在XSLT中有

<xsl:value-of select="expression"/>
Run Code Online (Sandbox Code Playgroud)

获取元素的值,但是有什么东西可以选择元素的标记名吗?

在这种情况下:

<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>
Run Code Online (Sandbox Code Playgroud)

要获得这样的输出:

name : Robert
profession : programmer
hobby : photography
Run Code Online (Sandbox Code Playgroud)

当然上面的XSLT不会编译因为

 <xsl:tag-of select="expression"/>
Run Code Online (Sandbox Code Playgroud)

不存在.但是怎么办呢?

Ras*_*dit 151

这将为您提供当前元素名称(标记名称)

<xsl:value-of select ="name(.)"/>
Run Code Online (Sandbox Code Playgroud)

OP-Edit:这也可以解决问题:

<xsl:value-of select ="local-name()"/>
Run Code Online (Sandbox Code Playgroud)

  • local-name是sans命名空间,这就是为什么它通常更好. (19认同)
  • 本地名称是您想要9次中的10次 (11认同)

Dim*_*hev 100

没有人确实指出了函数name()和语义的细微差别local-name().

  • name(someNode) 返回节点的全名,并包含前缀和冒号,以防节点是元素或属性.
  • local-name(someNode) 仅返回节点的本地名称,并且如果节点是元素或属性,则不包括前缀和冒号.

因此,在名称可能属于两个不同名称空间的情况下,必须使用该name()函数才能仍然区分这些名称.

而且,顺便说一下,可以在没有任何参数的情况下指定两个函数:

name() 是.的缩写 name(.)

local-name() 是.的缩写 local-name(.)

最后,请记住,不仅元素和属性具有名称,这两个函数也可以用于PI,并且它们是相同的).


Ray*_* Lu 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>
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 9

对于那些感兴趣的人,没有:

<xsl:tag-of select="."/>
Run Code Online (Sandbox Code Playgroud)

但是,您可以通过以下方式重新创建标记/元素:

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

这在xslt模板中很有用,例如,它处理许多不同元素的格式化数据值.如果您不知道正在处理的元素的名称,您仍然可以输出相同的元素,并在需要时修改该值.


Row*_*haw 6

<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>
Run Code Online (Sandbox Code Playgroud)

  • 修复了这个小细节 - 就个人而言,我认为人们应该解释为什么有些东西被贬低,因为它有助于解释集体知识...... (4认同)