web-dev-qa-db-ja.com

XSLT name-of要素はありますか?

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

存在しません。しかし、これはどのように行うことができますか?

96
Robert Gould

これにより、現在の要素名(タグ名)がわかります

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

OP-Edit:これもトリックを行います:

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

関数のセマンティクスの微妙な違いを指摘した人はいません name() および local-name()

  • name(someNode)はノードの完全な名前を返します。これには、ノードが要素または属性である場合にプレフィックスとコロンが含まれます。
  • local-name(someNode)は、ノードのローカル名のみを返します。ノードが要素または属性である場合、プレフィックスとコロンは含まれません。

したがって、名前が2つの異なる名前空間に属する場合、これらの名前を区別するためにname()関数を使用する必要があります。

そして、ところで、引数なしで両方の関数を指定することが可能です

name()name(.)の略語です

local-name()local-name(.)の略語です

最後に、要素と属性に名前があるだけでなく、これら2つの関数はPIでも使用でき、これらでも同一であることを忘れないでください。

99
<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>
14
Ray Lu

興味のある人には、何もありません:

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

ただし、次のようにしてタグ/要素を再作成できます。

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

これは、たとえば多くの異なる要素のデータ値のフォーマットを処理するxsltテンプレートで役立ちます。作業中の要素の名前がわからなくても、同じ要素を出力でき、必要に応じて値を変更できます。

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