Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xpath访问节点中的信息_Xpath_Xpath 2.0 - Fatal编程技术网

xpath访问节点中的信息

xpath访问节点中的信息,xpath,xpath-2.0,Xpath,Xpath 2.0,我需要从一个包含物业详细信息的网站上删除信息 <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> &

我需要从一个包含物业详细信息的网站上删除信息

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

房屋,
康迪
3600000卢比


“Kandy”和“Rs.3600000”的xpath表示法是什么

直接使用
text()
处理文本节点是不明智的,因为XML文档中存在细微差别

相反,寻址元素节点直接返回所有子代文本节点的串联作为元素值,这是人们通常想要的(并且在寻址文本节点时认为他们得到了)

我在课堂上使用的典型示例是OCR内容作为XML的示例:

<cost>39<!--that 9 may be an 8-->.22</cost>
39.22
使用XPath地址
cost
的元素的值为“39.22”,但在XSLT 1.0中,XPath地址
cost/text()
的值为“39”,这是不完整的。在XSLT2.0中(问题是如何标记的),您会得到两个文本节点“39”和“.22”,如果将它们连接起来,看起来是正确的。但是,如果您将它们传递给需要单例参数的函数,您将得到一个运行时错误。对元素寻址时,返回的文本将连接到单个字符串中,该字符串适用于单例参数

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


因此
//span[@class='location'或@class='data']
将找到这两个字段,如果这两个字段是整个文档中唯一的此类元素。您可能需要从文档树内部的某个位置使用“//span”。

直接使用
text()
来寻址文本节点是不明智的,因为XML文档中存在细微差别

相反,寻址元素节点直接返回所有子代文本节点的串联作为元素值,这是人们通常想要的(并且在寻址文本节点时认为他们得到了)

我在课堂上使用的典型示例是OCR内容作为XML的示例:

<cost>39<!--that 9 may be an 8-->.22</cost>
39.22
使用XPath地址
cost
的元素的值为“39.22”,但在XSLT 1.0中,XPath地址
cost/text()
的值为“39”,这是不完整的。在XSLT2.0中(问题是如何标记的),您会得到两个文本节点“39”和“.22”,如果将它们连接起来,看起来是正确的。但是,如果您将它们传递给需要单例参数的函数,您将得到一个运行时错误。对元素寻址时,返回的文本将连接到单个字符串中,该字符串适用于单例参数

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


因此
//span[@class='location'或@class='data']
将找到这两个字段,如果这两个字段是整个文档中唯一的此类元素。您可能需要从文档树中的某个位置使用“//span”。

您的利用是正确的,而且是一个很好的利用(!),但很容易被误解。“但是在XSLT1.0中,XPath地址cost/text()的值是“39”,这一点很重要。即使在xpaht-1.0中,
cost/text()
的XPATH结果也是所有直接子文本节点的列表。其中,
xsl:value of
将只返回第一个,但
的副本将
返回全部。谢谢,hr_117,是的。我假设原始海报和大多数人一样使用。但我对XSLT2.0的警告肯定适用:如果XPath地址用作函数的第一个参数,如
contains()
,则会出现运行时错误,因为第一个参数不是单例。我告诉学生们的观点是“如果你认为你需要使用
text()
,那么再想想,因为你可能不会“更多地考虑这个问题,在XSLT1中,
contains(cost,'2')
返回true,
contains(cost/text(),'2')
返回false,在XSLT2中,
contains(cost/text(),'2'))
返回一个运行时错误,转换中止。您的攻击是正确的,是一个很好的(!),但很容易被误解。“但是在XSLT1.0中,XPath地址cost/text()的值是“39”,这一点很重要。即使在xpaht-1.0中,
cost/text()
的XPATH结果也是所有直接子文本节点的列表。其中,
xsl:value of
将只返回第一个,但
的副本将
返回全部。谢谢,hr_117,是的。我假设原始海报和大多数人一样使用。但我对XSLT2.0的警告肯定适用:如果XPath地址用作函数的第一个参数,如
contains()
,则会出现运行时错误,因为第一个参数不是单例。我告诉学生们的观点是“如果你认为你需要使用
text()
,那么再想想,因为你可能不会“更多地考虑这个问题,在XSLT1中,
contains(cost,'2')
返回true,
contains(cost/text(),'2')
返回false,在XSLT2中,
contains(cost/text(),'2'))
返回运行时错误,转换异常终止。