本文主要是介绍一个低级错误,XPath中/和//,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
昨天我做的一个程序中被发现有一个错误,我检查了程序,但是没有问题,检查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中/和//的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!