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"/>
存在しません。しかし、これはどのように行うことができますか?
これにより、現在の要素名(タグ名)がわかります
<xsl:value-of select ="name(.)"/>
OP-Edit:これもトリックを行います:
<xsl:value-of select ="local-name()"/>
関数のセマンティクスの微妙な違いを指摘した人はいません name()
および local-name()
。
name(someNode)
はノードの完全な名前を返します。これには、ノードが要素または属性である場合にプレフィックスとコロンが含まれます。local-name(someNode)
は、ノードのローカル名のみを返します。ノードが要素または属性である場合、プレフィックスとコロンは含まれません。したがって、名前が2つの異なる名前空間に属する場合、これらの名前を区別するためにname()
関数を使用する必要があります。
そして、ところで、引数なしで両方の関数を指定することが可能です:
name()
はname(.)
の略語です
local-name()
はlocal-name(.)
の略語です
最後に、要素と属性に名前があるだけでなく、これら2つの関数は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:tag-of select="."/>
ただし、次のようにしてタグ/要素を再作成できます。
<xsl:element name="{local-name()}">
<xsl:value-of select="substring(.,1,3)"/>
</xsl:element>
これは、たとえば多くの異なる要素のデータ値のフォーマットを処理するxsltテンプレートで役立ちます。作業中の要素の名前がわからなくても、同じ要素を出力でき、必要に応じて値を変更できます。
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>