2

给定以下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

4 回答 4

3

您不能将 adiv放在 ap中。开始自动div关闭。p请参阅 在 <p> 标记内嵌套块级元素......对还是错?

于 2012-09-03T16:59:24.453 回答
0

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

于 2012-09-03T17:11:01.883 回答
0

XPath 区分大小写。

所提供的 XPath 表达式都没有选择任何 node,因为在所提供的 XML 文档中没有font具有命名属性class的元素(该元素font具有CLASS属性,这与具有class属性不同,因为大小写不同)。

由于相同的原因,font并且FONT是具有不同名称的元素。

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

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

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

基于 XSLT 的验证

<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>

当此转换应用于提供的 XML 文档时

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

计算这两个表达式,并将此计算的结果复制到输出:

<font CLASS="adornmentsText">$1.00</font>
=============
  <font CLASS="adornmentsText">$1.00</font>
于 2012-09-03T17:31:21.963 回答
0

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

于 2012-09-03T21:50:23.047 回答