到目前为止,在所有其他答案中,不仅/text()
没有帮助,它是潜在(甚至可能)的问题。对于档案的读者来说,他们应该意识到使用时遇到的问题/text()
在函数参数的地址中。在我的专业工作中,解决问题的要求非常(非常!)text()
直接地。
我正在谈论其他帖子中的这些表达方式:
substring-after(//td[@class='show_content']/text(), 'on ')
and
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 ”位于第二个文本节点上(第一个文本节点中有“[”)。在 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”,因为它是后代文本节点,而不是子文本节点。
那么,在这两个表达式中,以下内容将适用于两个修改后的输入,因为此时处理的是元素的值,而不是文本节点的值。元素的值是所有后代文本节点的串联。
So:
substring-after(td[@class='show_content'], 'on ')
and
substring(td[@class='show_content'], 16, 10)
将作用于元素中找到的整个字符串值。但如果有多个,即使上面的方法也会出现基数问题<td>
所以表达式无论如何都必须重写。
我的观点是,使用text()
引起了我的注意,我告诉我的学生他们是否认为需要使用text()
在 XPath 表达式中,他们需要重新思考,因为在大多数情况下他们不需要。