2013-06-21 51 views
0

我需要从一个包含属性详细信息的网站中取消信息。xpath访问节点中的信息

<div class="inner"> 
<div class="col"> 
    <h2><a href="house-in-digana-for-sale-kandy-32">House in Digana </a></h2> 
    <div class="meta"> 
     <div class="date"></div> 
     <span class="category">Houses</span>, 
    <span class="location">Kandy</span> 
    </div> 
</div> 
    <div class="attr polar"> 
    <span class="data">Rs. 3,600,000</span> 
    </div> 

什么是 “康提” 和 “Rs。3600000” XPath格式?

回答

3

这是不明智的地址文本节点直接使用text()因为XML文档中的细微之处。

相反,解决一个元素节点直接返回的元素值,也就是人们通常想要的(并认为当他们处理文本节点,他们所得到)所有后代文本节点的连接。

我在课堂上使用的典型的例子是OCR'ed含量为XML的该实施例中:

<cost>39<!--that 9 may be an 8-->.22</cost> 

使用XPath地址cost的元素的值是“39.22”,但在XSLT 1.0的XPath地址cost/text()的值是“39”,它不完整。在XSLT 2.0中(这是问题的标记方式),您会得到两个文本节点“39”和“.22”,如果将它们连接起来看起来正确。但是,如果将它们传递给需要单例参数的函数,则会出现运行时错误。当你访问一个元素时,返回的文本被连接成一个单独的字符串,这个字符串适合单例参数。

我告诉学生,在我所有的专业工作中,只有非常(很!)几次,我必须在我的样式表中使用text()

所以//span[@class='location' or @class='data']会发现这两个领域,如果这些人在整个文档中唯一的此类元素。您可能需要使用文档树内某个位置的“.//span”。

+0

你的开发是正确的,一个很好的(!),但可以很容易被误解。 “在XSLT 1.0中,XPath地址开销/ text()的值是”39“_”是**的**值。即使在xpaht-1.0中,cost/text()的XPATH结果也是所有直接子文本节点的列表。其中'xsl:value-of'将只返回第一个,但'copy-of'将返回全部。 –

+0

谢谢你,hr_117,是的。我假设最初的海报大部分都是使用。但是我对XSLT 2.0的警告肯定会适用:如果将XPath地址用作像contains()这样的函数的第一个参数,那么会有运行时错误,因为第一个参数不是单例。我告诉学生的观点是“如果你认为你需要使用'text()',那么再想一想,因为你可能不会” –

+0

在XSLT 1中更多地考虑这个''contains(cost,'2') '返回true,'contains(cost/text(),'2')'返回false,并且在XSLT 2中,contains(cost/text(),'2')'返回运行时错误,并且转换异常终止。 –