有XSLT名称元素吗?


101

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

不存在。但是,怎么办呢?


与该问题最相关的标签是XPath。这两个函数都是XPath标准函数,可以在任何托管语言(C#,XSLT,XQuery等)的上下文中的XPath表达式中使用。请重新标记
Dimitre Novatchev 2009年

文本:“在XSLT中,存在<xsd:value-of select =“ expression” />“ –包含错误。XSLT指令通常使用的前缀是“ xsl”。通常,在使用XML模式时,我们使用前缀“ xsd”或“ xs”。请纠正。
Dimitre Novatchev 09年

Answers:


156

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

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

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

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

12
您想要的是10倍的本地名称
annakata

20
local-name是sans名称空间,这就是为什么它通常更好的原因。
乔恩·W

102

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

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

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

而且,顺便说一句,可以指定两个函数而无需任何参数

name() 是的缩写 name(.)

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

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


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

作为一种好的做法,在获取节点的值<xsl:value-of select =“ normalize-space(。)” />时,请始终使用normalize-space(),这会减少多余的空间
SO用户2009年

只有在输入收集阶段未对其进行处理的情况下,才需要进行这种标准化/消毒。这样一来,您就不必在访问时进行操作,而访问时间通常要多得多。在添加到RDB之前,需要先这样做,而xml文档只是另一个数据库。
Patanjali

9

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

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

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

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

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


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

那么,为什么不投票呢?如果您也不想使用命名空间,那么Granted可能会提到local-name(),但这对于更广泛的社区解释为什么这样做不起作用将很有用。
罗兰·肖

也许,它无法转换给定的XML。在这种情况下,名称(。)将为“人”。它应该是“名称”,“专业”和“爱好”。
Ray Lu,

@CodeMelt为什么然后您不接受已接受的答案呢?很好,但是比这更具体。我投票给罗兰·肖(Rowland Shaw)答案,因为它提供了该问题的答案。请在投票者包含错误,不正确或具误导性的信息时进行表决
Dimitre Novatchev 2009年

4
修正了这个小细节-就我个人而言,我认为人们应该解释为什么某些事情会被否决,因为它有助于解释集体知识……
Rowland Shaw,2009年

我们的声誉可能会引起人们的注意,但由于不能保证我们发布的内容值得,因此真正重要的是我们贡献的质量。没有理由导致质量下降。
Patanjali
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.