「。」だけでなく、なぜtext()を使うべきなのかわかりません。違いはなんですか?
//library/book/author[text() = "An Author"]
vs
//span[@class="whateverclass"][. = "An Author"]
.
span
は、単一のノード、現在のコンテキストノード(この例では要素ノード)を含むノードセットです。これの文字列値は、そのすべての子孫テキストノードの連結であるため、
<span class="whateverclass">Ann <b>A.</b> Author</span>
これは文字列"Ann A. Author"
(引用符なし)になります。
text()
は、コンテキストノードのすべての直接の子テキストノード(2つのノード"Ann "
と" Author"
上記の例)を含むノードセットです。いずれかのノードが指定された文字列値を持っている場合、一方がノードセットで、もう一方が文字列であるという=
比較は真であるため、上記の要素例はいずれかのパターンと一致します。<span>
span[@class='whateverclass'][. = 'Ann A. Author']
span[@class='whateverclass'][text() = 'Ann ']
span[@class='whateverclass'][text() = ' Author']
しかし、一致しません[text() = 'Ann A. Author']
.
現在のノードとすべての子ノードのテキストを提供します
text()
現在のノードのテキストのみを表示します
結論:text()
ノード内のテキストをチェックする場合に使用します。これ.
は、すべての潜在的な子ノードのテキストもチェックするためです。
通常、text()は使用しないでください。「。」を使用する コメントと処理命令を無視して文字列値をアセンブルしますが、text()を使用すると、コメントが表示された場所に基づいてテキストをいくつかの部分に分割できます。混合コンテンツを一度に1つずつ処理する場合にのみ、テキストを使用してください。
違いはおそらく、要素に1つ以上の子要素があり、複数のテキスト要素がある例で最もよく示されます(要素には子要素の間に複数のテキスト要素を散在させることができます)。
<element>
text1
<child>
child1text1
<child>
text2
</element>
element
現在のものであると仮定します。
.
text1 child1text1 text2
(空白を使用して)戻りますtext()[1]
戻りますtext1
text()[2]
戻りますtext2
特筆すべきはtext()
、xslt1.0とxslt2.0では動作が異なることです。
text()
text1
xslt1.0でのみ戻りますtext()
text1 text2
xslt 2.0で(空白を含む)を返します