有人可以帮我找到一个xPath,它会根据文本找到一个元素,这个文本被分成几个跨度?当我使用text()函数时,它似乎只找到元素文本的起始序列,直到第一个跨度。
例如,在以下场景中,我想仅找到第一个<h5>
而不是另一个...
<h5>
A
<span>xxx</span>
B
</h5>
...
<h5>
A
<span>xxx</span>
C
</h5>
。那就是找到一个元素,它显示一个文本&#34; A xxx B&#34;
{{1}}
答案 0 :(得分:1)
试试这个:
h5[1]
您可以使用索引选择集合中的某个项目。
答案 1 :(得分:1)
使用descendant-or-self::node()
获取h5
代码中的全文,使用normalize-space()
处理换行符和空格:
//h5[normalize-space(descendant-or-self::node()) = 'A xxx B']
演示(使用xmllint
):
$ xmllint index.html --xpath "//h5[normalize-space(descendant-or-self::node()) = 'A xxx B']"
<h5>
A
<span>xxx</span>
B
</h5>
index.html
包含:
<div>
<h5>
A
<span>xxx</span>
B
</h5>
...
<h5>
A
<span>xxx</span>
C
</h5>
</div>
答案 2 :(得分:0)
您可以匹配所有h5
并且仅在节点满足特定条件时复制/执行任何操作。这个条件是检查最后一个文本节点(或[2]
秒),它是否等于某个硬编码字符串。您可能需要使用normalize-space()
来从文本节点中删除空格:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<result>
<xsl:apply-templates select="root/h5"/>
</result>
</xsl:template>
<xsl:template match="h5">
<xsl:if test="normalize-space(./text()[last()]) = 'C'">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0" encoding="utf-8"?>
<result>
<h5>
A
<span>xxx</span>
C
</h5>
</result>
答案 3 :(得分:0)
类似情况:
<button title="Create New" accesskey="N">
Create
<span class="X">N</span>
ew
</button>
创建带文字的按钮&#34;创建新的&#34;。 要找到此按钮,您可以使用
//button[descendant-or-self::* = 'Create New']
这是 alecxe 答案的简单版本(如果你没有空间)