给出以下html
<p>
<div class="allpricing">
<p class="priceadorn">
<FONT CLASS="adornmentsText">NOW: </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()]
什么都不返回?
答案 0 :(得分:3)
您无法在div
内放置p
。 div
开始自动关闭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
属性不同。)
由于同样的原因,class
和font
是具有不同名称的元素。
这两个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: </FONT>
<font CLASS="adornmentsText">$1.00</font>
</p>
</div>
</p>
答案 3 :(得分:0)
您将源描述为HTML而不是XML文档,但您尚未解释如何解析它。如果使用HTML解析器解析它,解析器将“修复”它以将其转换为有效的HTML,这意味着它构造的树不直接反映您在源中编写的内容。 XPath看到这个“修复过的”树,而不是原始树。