これまでの他のすべての回答では、役に立たないだけでなく/text()
、潜在的な(または可能性の高い)問題です。/text()
アーカイブの読者は、関数の引数に in アドレスを使用する際の問題に注意する必要があります。text()
私の専門的な仕事では、直接アドレス指定するための要件は非常に (非常に!) ありません。
私は他の投稿からこれらの表現について話している:
substring-after(//td[@class='show_content']/text(), 'on ')
と
substring(//td[@class='show_content']/text(), 16, 10)
「//」が使用されるべきではない場合に使用されるという問題は脇に置きましょう。XSLT 1.0 では、最初の引数のみ<td>
が考慮され、XSLT 2.0 では、最初の引数の複数のシングルトンによって実行時エラーがトリガーされます。
入力である場合は、次の変更された XML を検討してください。
<td>[<emphasis>Rank Info</emphasis>] on 2013-06-27 14:26 Read 174 Times</td>
... " on " は 2 番目のテキスト ノードにあります (最初のテキスト ノードには "[" が含まれています)。XSLT 1.0 では、どちらの式も空の文字列を返します。XSLT 2.0 では、両方の式が実行時エラーを引き起こします。
入力である場合は、次の変更された XML を検討してください。
<td>[Rank Info]<emphasis> on </emphasis>2013-06-27 14:26 Read 174 Times</td>
どちらの場合も、 のtext()
子に<td>
は文字列「on」が含まれません。これは、子テキスト ノードではなく、子孫テキスト ノードであるためです。
両方の式で、テキスト ノードの値ではなく要素の値を処理するため、次の式は変更された両方の入力に対して機能します。要素の値は、すべての子孫テキスト ノードの連結です。
そう:
substring-after(td[@class='show_content'], 'on ')
と
substring(td[@class='show_content'], 16, 10)
要素で見つかった文字列値全体に作用します。しかし、上記でも複数の<td>
子が存在する場合はカーディナリティの問題が発生するため、とにかく式を書き直す必要があります。
要点は、 の使用がtext()
私の目に留まりtext()
、XPath 式で使用する必要があると考えている場合は、ほとんどの場合そうではないため、再考する必要があることを学生に伝えます。