有没有XSLT名称的元素?

在XSLT中有

<xsl:value-of select="expression"/> 

得到一个元素的值,但有什么要select元素的标签名称?

在这样的情况下:

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

不存在。 但是,这怎么可能呢?

这会给你当前的元素名称(标签名称)

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

操作编辑:这也将诀窍:

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

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

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

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

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

name()name(.)的缩写

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

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

 <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="name(.)" /> : <xsl:value-of select="."/> 

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

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

不过,您可以通过以下方式重新创build标签/元素:

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

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