一个低级错误,XPath中/和//

原创 2004年07月15日 09:52:00

昨天我做的一个程序中被发现有一个错误,我检查了程序,但是没有问题,检查XSLT文件,找到了问题所在,这是一个比较低级的失误。
XPath的路径选择错误。
先说明一下程序的结构,数据记录在MS SQL2000中,使用ASP访问数据库,把它展示出来,因为这是一个分级的树形结构,所以我用XML来作为数据集的结构,而没有使用Recordset。它的XML结构如下:
<?xml version="1.0" encoding="gb2312"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
 <xs:element name="RootIndex">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="ItemIndex"/>
   </xs:sequence>
   <xs:attribute name="BranchCode" type="xs:byte" use="required"/>
   <xs:attribute name="StatDate" type="xs:string" use="required"/>
  </xs:complexType>
 </xs:element>
 <xs:element name="ItemIndex">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="ItemIndex" minOccurs="0" maxOccurs="unbounded"/>
   </xs:sequence>
   <xs:attribute name="ID" type="xs:int" use="required"/>
   <xs:attribute name="Name" type="xs:string" use="required"/>
   <xs:attribute name="Score" type="xs:int" use="required"/>
   <xs:attribute name="Level" type="xs:int" use="required"/>
  </xs:complexType>
 </xs:element>
</xs:schema>

它产生的一个xml实例文档如下:
<?xml version="1.0" encoding="gb2312"?>
<RootIndex BranchCode="100" StatDate="2004-6-1">
 <ItemIndex ID="5" Name="根节点" Score="15" Level="1">
  <ItemIndex ID="6" Name="子节点6" Score="3" Level="2"/>
  <ItemIndex ID="7" Name="子节点7" Score="8" Level="2">
   <ItemIndex ID="8" Name="子节点8" Score="4" Level="3"/>
   <ItemIndex ID="9" Name="子节点9" Score="4" Level="3"/>
  </ItemIndex>
  <ItemIndex ID="10" Name="子节点10" Score="4" Level="2"/>
 </ItemIndex>
</RootIndex>


在网页的展示当中,我使用XSLT来将XML数据集转换成HTML文档,结果展示这是一个具有分级结构的表格。

因为叶节点的@Score属性能够被用户编辑,父节点需要统计叶节点的@Score,网页提供一个提交的按钮,只有提交之后,程序才重新计算总分,往数据库里记录,在没有提交分数之前,用xslt把父节点上的@Score重新计算,然后刷新表格区的信息。
在xslt中的求子节点分数和的表达式应该为:sum(*/@Score),但是在路径选择上,我犯了一个错误,我把它写成了sum(*//@Score)。
路径*/@Score表示对当前子节点中的@Score属性集合
路径*//@Score表示对当前节点的所有后代节点中的@Score属性

错误的xslt把ID为5的节点中的@Score计算为23

XPath中,/和//的区别就是一个选择子节点,一个选择后代节点,因此计算结果出现了错误。

 

XPath 位置路径

位置路径 位置路径标识了和上下文有关的一组XPath节点,是XPath表达式的特化,使用/表示层级关系。  位置路径有相对路径和绝对路径。    相对路径:     "nodename/childno...
  • zzcv_
  • zzcv_
  • 2007-09-21 15:14:00
  • 2962

关于xpath中的.// 和 //

在今天之前,一直没有注意过.//的用法,习惯性的都是用//来查元素。比如在 Menu Title 中找id="div1"的 div 我们可以用 //div[@id='div1'],Web...
  • aerchi
  • aerchi
  • 2012-11-08 16:03:20
  • 7695

xpath抓取的值有空格换行符等问题

解决办法: normalize-space() 例子: 原来的xpath为: user=selector.xpath('//*[@id="Con"]/tr[1]/t...
  • u012836179
  • u012836179
  • 2017-04-10 16:22:44
  • 3425

Windows情况下XPath 安装失败

在使用Pip install lxml安装时发现错误 应该是缺少某个头文件。 解决方法: 在这个网址http://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载lxm...
  • Asc11_
  • Asc11_
  • 2016-03-29 16:54:04
  • 922

xpath解析使用extract()的各种情况分析

返回一个SelectorList 对象 http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/selectors.html#selectorlist S...
  • nzjdsds
  • nzjdsds
  • 2017-08-16 21:17:08
  • 1510

爬虫 XPath

安装 pip install lxml 这样应该是装不上的,去手动吧 Error:ImportError: DLL load failed: %1 不是有效的 Win32 应用程序...
  • u014015972
  • u014015972
  • 2016-01-19 14:01:41
  • 5905

Scrapy笔记(4)- Selector详解

在你爬取网页的时候,最普遍的事情就是在页面源码中提取需要的数据,我们有几个库可以帮你完成这个任务: BeautifulSoup是python中一个非常流行的抓取库,它还能合理的处理错误格式的标签...
  • sdulsj
  • sdulsj
  • 2016-10-31 17:58:52
  • 8307

XPATH的几个常用函数

1.contains (): //div[contains(@id,'in')] ,表示选择id中包含有’in’的div节点 2.text():由于一个节点的文本值不属于属性,比如“baidu”,所...
  • u014096024
  • u014096024
  • 2015-09-10 08:34:23
  • 6547

scrapy:xpath string(.)非常注意问题

text = selector.xpath('//div[@span="ct"]/string(.)').extract_first() #写成这样是xpath语法错误,而把string(.)单独提出...
  • ShellDawn
  • ShellDawn
  • 2017-05-05 10:46:54
  • 2640

XPATH错误方法未知:contains(@” 的解决办法

创建xmlDom后加上“xmlDom.setProperty(SelectionLanguage,XPath);xPath查询如:等值查询:String xPath = "users/user[u...
  • zk_2000
  • zk_2000
  • 2008-09-04 12:44:00
  • 5576
收藏助手
不良信息举报
您举报文章:一个低级错误,XPath中/和//
举报原因:
原因补充:

(最多只允许输入30个字)