到目前为止,在所有其他答案中,这不仅/text()
没有帮助,而且可能(甚至可能)是一个问题。对于档案的读者,他们应该意识到/text()
在地址中使用函数参数的问题。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 ”在第二个文本节点上(第一个文本节点中有“[”)。在 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 表达式中使用,他们需要重新考虑,因为在大多数情况下他们不需要。