为什么这个xpath选择器失败了?

时间:2012-09-03 16:57:11

标签: xpath

给出以下html

<p>
    <div class="allpricing">
      <p class="priceadorn">
          <FONT CLASS="adornmentsText">NOW:&nbsp;</FONT>
          <font CLASS="adornmentsText">$1.00</font>
      </p>
    </div>
</p>

为什么

//div[@class="allpricing"]/p[@class="priceadorn"][last()]/font[@class="adornmentsText"][last()]

返回$ 1.00的预期值

但添加了p元素

//p/div[@class="allpricing"]/p[@class="priceadorn"][last()]/font[@class="adornmentsText"][last()]

什么都不返回?

4 个答案:

答案 0 :(得分:3)

您无法在div内放置pdiv开始自动关闭p。看到 Nesting block level elements inside the <p> tag... right or wrong?

答案 1 :(得分:0)

我经常发现修理案件是罪魁祸首。 XPath 1.0区分大小写,除非您明确处理混合情况,否则在很多情况下会失败。

答案 2 :(得分:0)

XPath区分大小写。

所提供的XPath表达式都没有选择任何节点,因为在提供的XML文档中没有font元素,其属性名为class(元素{{1 }}具有font属性,这与由于大小写不同而具有CLASS属性不同。)

由于同样的原因,classfont是具有不同名称的元素。

这两个XPath表达式,在根据提供的XML文档进行评估时,会产生相同的结果:

FONT

   //div[@class="allpricing"]
       /p[@class="priceadorn"]
                       [last()]
          /font[@CLASS="adornmentsText"]
                               [last()] 

基于XSLT的验证

//p/div[@class="allpricing"]
      /p[@class="priceadorn"]
                        [last()]
         /font[@CLASS="adornmentsText"]
                                   [last()]

在提供的XML文档上应用此转换时

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  '//div[@class="allpricing"]
       /p[@class="priceadorn"]
                       [last()]
          /font[@CLASS="adornmentsText"]
                               [last()]'/>
=============
  <xsl:copy-of select=
   '//p/div[@class="allpricing"]
          /p[@class="priceadorn"]
                            [last()]
             /font[@CLASS="adornmentsText"]
                                       [last()]
   '/>
 </xsl:template>
</xsl:stylesheet>

评估两个表达式,并将此评估的结果复制到输出中:

<p>
    <div class="allpricing">
      <p class="priceadorn">
          <FONT CLASS="adornmentsText">NOW:&#xA0;</FONT>
          <font CLASS="adornmentsText">$1.00</font>
      </p>
    </div>
</p>

答案 3 :(得分:0)

您将源描述为HTML而不是XML文档,但您尚未解释如何解析它。如果使用HTML解析器解析它,解析器将“修复”它以将其转换为有效的HTML,这意味着它构造的树不直接反映您在源中编写的内容。 XPath看到这个“修复过的”树,而不是原始树。