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


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

このテキスト:「XSLTには<xsd:value-of select = "expression" />があります」-エラーが含まれています。XSLT命令で通常使用される接頭辞は「xsl」です。通常、XMLスキーマを使用する場合、接頭辞「xsd」または「xs」を使用します。正してください。
Dimitre Novatchev、

回答:


156

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

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

OP編集:これもトリックを行います:

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

12
local-nameは、10回のうち9回欲しいものです
アナカタ09

20
local-nameはsans名前空間ではありません。これが通常はより良い理由です。
Jon W、

102

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

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

したがって、名前が2つの異なる名前空間に属している可能性がある状況ではname()、これらの名前を区別するために関数を使用する必要があります。

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

name() の略です name(.)

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

最後に、要素と属性に名前があるだけでなく、これらの2つの関数は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>

ノードのvalue-ofを取得するときは常にnormalize-space()を使用することをお勧めします<xsl:value-of select = "normalize-space(。)" />これにより、余分なスペースが削除されます
SO User

このような正規化/サニタイズは、入力の収集段階で処理されなかった場合にのみ必要になります。これを行うと、アクセス時に行う必要がなくなります。これは通常、はるかに頻繁に行われます。RDBに追加する前にそれを実行し、xmlドキュメントは単なる別のデータベースです。
パタンジャリ2018

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()に言及することもできましたが、これが機能しない理由を説明することは、より広いコミュニティにとって役立つでしょう。
Rowland Shaw、

おそらく、指定されたXMLを変換できませんでした。この場合、名前(。)は「人物」になります。「名前」、「職業」、「趣味」である必要があります。
レイ・ルー

@CodeMeltなぜあなたは受け入れられた答えに反対票を投じなかったのですか?それは良いですが、これよりも具体的ではありません。Rowland Shawの質問への回答が得られたので、その回答に賛成票を投じました。pleseは、downvote aswerは間違っている、間違ったまたは誤解を招く情報が含まれている場合にのみ
Dimitre Novatchev

4
マイナーな詳細を修正しました-個人的には、集団の知識を説明するのに役立つので、人々が何かが反対票を投じられた理由を説明する必要があると思います...
Rowland Shaw

私たちの評判は注目を集めるかもしれませんが、私たちが投稿したものに価値があることを保証するものではないため、本当に重要なのは貢献の質です。理由がなくても、質の悪い貢献はありません。
パタンジャリ2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.