使用xPath按文本定位Web元素将跨多个跨度进行拆分

时间:2014-05-07 14:11:08

标签: html xpath html-parsing

有人可以帮我找到一个xPath,它会根据文本找到一个元素,这个文本被分成几个跨度?当我使用text()函数时,它似乎只找到元素文本的起始序列,直到第一个跨度。

例如,在以下场景中,我想仅找到第一个<h5>而不是另一个... <h5> A <span>xxx</span> B </h5> ... <h5> A <span>xxx</span> C </h5> 。那就是找到一个元素,它显示一个文本&#34; A xxx B&#34;

{{1}}

4 个答案:

答案 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 答案的简单版本(如果你没有空间)