xpath的过滤问题

yangbobo1992 2012-12-06 03:45:32

我要做的是过滤。多个过滤条件的。
调用接口返回的是一个xml。当我点击其中一个设施服务的时候,就要在xml里面过滤掉没有选择的那一项的。

这是大致xml的图。应该可以看出来一些东西。


可以使用多个过滤条件,而且多个过滤条件里面的establish下的name都必须存在。
我现在是
我的xml里面是hotelInfo是多个,而hotelInfo下面的establish也是多个。每个establish下面又有多个name
我想过滤这些name里面都有那些服务设施。


求大神们解决。谢谢了。
...全文
454 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序媛小李 2012-12-11
  • 打赏
  • 举报
回复
取出所有name值就是它有的设施,//establish/name
yangbobo1992 2012-12-11
  • 打赏
  • 举报
回复
我不要取出name。我要直接在xml文件里面过滤掉。条件符合的就直接放到另外一个xml文件里面去。
yangbobo1992 2012-12-10
  • 打赏
  • 举报
回复
var tablexml = new ActiveXObject("Microsoft.XMLDOM");
tablexml.async = false;
var tablexsl = new ActiveXObject("Microsoft.XMLDOM");
tablexsl.async = false;
//一个加载临时的xml文件
var showxml = new ActiveXObject("Microsoft.XMLDOM");
showxml.async = false;
var doc ;
var delxml ;
/**升序和降序的控制*/
var bol = true;

//每页显示的记录数
var onePageNum=0;
var count = 0;//每次取的记录数量 10*onePageNum
var curPageNum=0; //当前翻到的页数
var totalPageNum;//总页数
var recordNum;//展现的记录数量(需要后台提供)
//当前总的记录数量,不是前台展现的,是实际页面保存的记录数量,一般是10*onePageNum
var currentTotalPageNum ;
//请求的页码数量(数据不是一次性读取,而是先取10*onePageNum 条,然后根据翻到的页数决定再先后台要对应的量)
var requestPage = 0;

var pris=null;//价格筛选条件
var facilitys="";//设施服务筛选条件

function init(priceScope){
//初始化默认值
onePageNum=5;
count = 0
curPageNum=1
requestPage = 1;
tableDisplay(priceScope);
}

function tableDisplay(price){
tablexml.load("../demo/hotelSearch.xml");//加载xml文件
//加载临时的xml文件
showxml.load("../demo/hotelSearch1.xml");
// tablexml.load("language.xml");//加载xml文件
tablexsl.load("/ECS/modules/holiday/hotel/style/xsl/hotelShow.xsl");//加载xsl文件
//表格分页计算
Paging(price);
pageShow();
}

/**表格分页计算*/
function Paging(pri){
pris=pri;//把传进来的价格的筛选条件赋值
var root;
if(pri==null){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo");
}else{
rootTemp=showxml.getElementsByTagName("page/hotelInfos");
if(pri=='400以下'){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo[0<price and price<400]");
for(var i=0;i<root.length;i++){
rootTemp[0].appendChild(root[i]);
}
}else if(pri=='400-700'){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo[price>400 and price<700]");
for(var i=0;i<root.length;i++){
rootTemp[0].appendChild(root[i]);
}
}else if(pri=='700-1000'){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo[price>700 and price<1000]");
for(var i=0;i<root.length;i++){
rootTemp[0].appendChild(root[i]);
}
}else if(pri=='1000-1500'){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo[price >1000 and price<1500]");
for(var i=0;i<root.length;i++){
rootTemp[0].appendChild(root[i]);
}
}else if(pri=='1500以上'){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo[price>1500]");
for(var i=0;i<root.length;i++){
rootTemp[0].appendChild(root[i]);
}
}

if(rootTemp){
currentTotalPageNum=rootTemp.length;
}else{
currentTotalPageNum=0;
}
}

if(facilitys!=""){
var facility=facilitys.split(",");
rootTemp=showxml.getElementsByTagName("page/hotelInfos");
if(facility.length==1){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo/establishs/establish[name='"+facility[0]+"']");
for(var j=0;j<root.length;j++){
rootTemp[0].appendChild(root[j]);
}
}else if(facility.length==2){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo/establishs/establish[name='"+facility[0]+" and name="+facility[1]+"']");
for(var j=0;j<root.length;j++){
rootTemp[0].appendChild(root[j]);
}
}else if(facility.length==3){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo/establishs/establish[name='"+facility[0]+" and name="+facility[1]+" and name="+facility[2]+"']");
for(var j=0;j<root.length;j++){
rootTemp[0].appendChild(root[j]);
}
}else if(facility.length==4){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo/establishs/establish[name='"+facility[0]+" and name="+facility[1]+" and name="+facility[2]+" and name="+facility[3]+"']");
for(var j=0;j<root.length;j++){
rootTemp[0].appendChild(root[j]);
}
}else if(facility.length==5){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo/establishs/establish[name='"+facility[0]+" and name="+facility[1]+" and name="+facility[2]+" and name="+facility[3]+" and name="+facility[4]+"']");
for(var j=0;j<root.length;j++){
rootTemp[0].appendChild(root[j]);
}
}else if(facility.length==6){
root = tablexml.selectNodes("page/hotelInfos/hotelInfo/establishs/establish[name='"+facility[0]+" and name="+facility[1]+" and name="+facility[2]+" and name="+facility[3]+" and name="+facility[4]+" and name="+facility[5]+"']");
for(var j=0;j<root.length;j++){
rootTemp[0].appendChild(root[j]);
}
}

if(rootTemp){
currentTotalPageNum=rootTemp.length;
}else{
currentTotalPageNum=0;
}
}

if(root){
currentTotalPageNum = root.length;
}else{
currentTotalPageNum = 0;
}

recordNum=currentTotalPageNum;//取总记录数

//priceScreen(root,pri);//调用价格筛选条件

var total = document.getElementById("totalData");
total.innerHTML=recordNum;

//recordNum = tablexml.selectSingleNode("//@linesum").value;//@linesum:是取的xml里面一个属性的值。
for(i=1;i<(recordNum/onePageNum);i++);//循环1到(总记录数/分页大小的值)
totalPageNum = i;

var price="";
//===================重新分页=======================
sortField=tablexsl.selectSingleNode("//@test");//取xsl里面属性是test的值
firstNum=onePageNum*(curPageNum-((requestPage-1)*10)-1)+1;//分页大小*(当前页-((请求页码的数量-1)*10)-1)+1
lastNum=onePageNum*(curPageNum-((requestPage-1)*10)-1)+onePageNum;//分页大小*(当前页-((请求页码的数量-1)*10)-1)+分页大小

text="position()>="+firstNum+" and position()<="+lastNum;
sortField.value=text;
//==========================================
if(pri==null || facilitys!=""){
listLayer.innerHTML=tablexml.transformNode(tablexsl);//用提供的样式,显示xml.输出到HTMl
}else{
listLayer.innerHTML=showxml.transformNode(tablexsl);//用提供的样式,显示xml.输出到HTMl
}
//document.all.totalRecords.innerHTML=recordNum;
document.all.curPage.innerHTML=curPageNum;
document.all.totalPageNum.innerHTML=totalPageNum;
//document.all.onePageNum.innerHTML=onePageNum;
}

/**添加页数的显示*/
function pageShow(){
//var pageStr = "";
var pageStr1 = "";
var showpage = 0;
if(totalPageNum <10)
showpage = totalPageNum;
else if((totalPageNum - (requestPage-1)*10)< 10)//总页数-(请求页数-1)*10<10
showpage = totalPageNum - (requestPage-1)*10;
else if((totalPageNum - (requestPage-1)*10)> 10)
showpage = totalPageNum - (requestPage-1)*10;
else
showpage = 10;
// for(var j=0;j<showpage;j++){
// pageStr = pageStr + " <a style='font-size: 16px;font-weight: bold;' href='javascript:pages1("+(j+1+(Number(requestPage)-1)*10)+");'>"+(j+1+(Number(requestPage)-1)*10)+"</a>";
// }

var start=Number(curPageNum-requestPage);
var end=parseInt(curPageNum+requestPage);
if(start==showpage && showpage==1){
start=1;
}else if(end==showpage){
end=showpage;
}
//pageStr = "  <a style='font-size: 16px;font-weight: bold;' href='javascript:pages1("+start+");'>«</a>" +
//pageStr
// + "  <a style='font-size: 16px;font-weight: bold;' href='javascript:pages1("+end+");'>»</a>";
pageStr1 = "  <img src='../../../common/images/holiday/hotel/images/shy.gif' onclick='pages1("+start+");'>" +
pageStr1 + "  <img src='../../../common/images/holiday/hotel/images/xia.gif' onclick='pages1("+end+");'/>";
//document.all.pageStr.innerHTML=pageStr;
document.all.pageStr1.innerHTML=pageStr1;
}
yangbobo1992 2012-12-10
  • 打赏
  • 举报
回复
我是要检测所有哪么name里,对于条件都成立的。
但是name又有
<category>1</category>
<name>停车场</name>
</establish>
<establish>
<category>2</category>
<name>健身房</name>
</establish>
<establish>
<category>3</category>
<name>游泳池</name>
</establish>
几个。
yangbobo1992 2012-12-10
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="gb2312"?> <hotelInfos> <hotelTitle> <price>价格</price> </hotelTitle> <hotelInfo> <ID>12341</ID> <name>广州白云酒店</name> <price>685</price> <englishName>Days Inn Guangzhou</englishName> <imageURL>http://www.daysinngz.cn/b/a.jpg </imageURL> <describeURL>http://www.daysinngz.cn </describeURL> <introduction>酒店由著名的温德姆酒店集团旗下的美国白云酒店集团(中国)直接经营管理。 </introduction> <addrass>广州市白云区云霄路88号</addrass> <brand>白云</brand> <note>此期间预订入住,每人每晚需支付1.5欧的城市税,此费用请客人支付酒店前台 </note> <rooms> <room> <roomName>标准房</roomName> <roomType>STV</roomType> <mealPlan>单早</mealPlan> <bedType>1</bedType> <count>3</count> <amount>350</amount> <serviceFee>200.00</serviceFee> <tax>102.00</tax> <currencyCode>CNY</currencyCode> <localCurrencyCode>USD</localCurrencyCode> <exchangeRate>1.0</exchangeRate> <commisionRate>3</commisionRate> <internet>Y</internet> <describe>面积19-22平米 大、小床 免费宽带上网</describe> </room> </rooms> <establishs> <establish> <category>0</category> <name>宽带上网</name> </establish> </establishs> </hotelInfo> <hotelInfo> <ID>12342</ID> <name>广州大塘酒店</name> <price>998</price> <englishName>Days Inn Guangzhou</englishName> <imageURL>http://www.daysinngz.cn/b/a.jpg </imageURL> <describeURL>http://www.daysinngz.cn </describeURL> <introduction>酒店由著名的温德姆酒店集团旗下的美国大塘酒店集团(中国)直接经营管理。 </introduction> <addrass>广州市白云区云霄路88号</addrass> <brand>大塘</brand> <note>此期间预订入住,每人每晚需支付1.5欧的城市税,此费用请客人支付酒店前台 </note> <rooms> <room> <roomName>标准房</roomName> <roomType>STV</roomType> <mealPlan>单早</mealPlan> <bedType>1</bedType> <count>1</count> <amount>320</amount> <serviceFee>200.00</serviceFee> <tax>100.00</tax> <currencyCode>CNY</currencyCode> <localCurrencyCode>USD</localCurrencyCode> <exchangeRate>1.0</exchangeRate> <commisionRate>3</commisionRate> <internet>Y</internet> <describe>面积19-22平米 大、小床 免费宽带上网、穿梭机场大巴、网球场、停车场</describe> </room> </rooms> <establishs> <establish> <category>0</category> <name>宽带上网</name> </establish> <establish> <category>1</category> <name>穿梭机场大巴</name> </establish> <establish> <category>2</category> <name>网球场</name> </establish> <establish> <category>3</category> <name>停车场</name> </establish> </establishs> </hotelInfo> <hotelInfo> <ID>12343</ID> <name>广州汉庭快捷江湾店酒店</name> <price>888</price> <englishName>Days Inn Guangzhou</englishName> <imageURL>http://www.daysinngz.cn/b/a.jpg </imageURL> <describeURL>http://www.daysinngz.cn </describeURL> <introduction>酒店由著名的温德姆酒店集团旗下的美国汉庭快捷江湾店酒店集团(中国)直接经营管理。 </introduction> <addrass>广州市白云区云霄路88号</addrass> <brand>汉庭快捷江湾店</brand> <note>此期间预订入住,每人每晚需支付1.5欧的城市税,此费用请客人支付酒店前台 </note> <rooms> <room> <roomName>标准房</roomName> <roomType>STV</roomType> <mealPlan>单早</mealPlan> <bedType>1</bedType> <count>3</count> <amount>400</amount> <serviceFee>200.00</serviceFee> <tax>150.00</tax> <currencyCode>CNY</currencyCode> <localCurrencyCode>USD</localCurrencyCode> <exchangeRate>1.0</exchangeRate> <commisionRate>3</commisionRate> <internet>Y</internet> <describe>面积30-40平米 大、小床 免费宽带上网、游泳池、停车场</describe> </room> </rooms> <establishs> <establish> <category>0</category> <name>宽带上网</name> </establish> <establish> <category>1</category> <name>游泳池</name> </establish> <establish> <category>2</category> <name>停车场</name> </establish> </establishs> </hotelInfo> <hotelInfo> <ID>12344</ID> <name>广州莫泰168酒店</name> <price>1088</price> <englishName>Days Inn Guangzhou</englishName> <imageURL>http://www.daysinngz.cn/b/a.jpg </imageURL> <describeURL>http://www.daysinngz.cn </describeURL> <introduction>酒店由著名的温德姆酒店集团旗下的美国莫泰168酒店集团(中国)直接经营管理。 </introduction> <addrass>广州市白云区云霄路88号</addrass> <brand>莫泰168</brand> <note>此期间预订入住,每人每晚需支付1.5欧的城市税,此费用请客人支付酒店前台 </note> <rooms> <room> <roomName>标准房</roomName> <roomType>STV</roomType> <mealPlan>单早</mealPlan> <bedType>1</bedType> <count>2</count> <amount>320</amount> <serviceFee>200.00</serviceFee> <tax>100.00</tax> <currencyCode>CNY</currencyCode> <localCurrencyCode>USD</localCurrencyCode> <exchangeRate>1.0</exchangeRate> <commisionRate>3</commisionRate> <internet>Y</internet> <describe>面积19-22平米 大、小床 免费宽带上网、穿梭机场大巴、游泳池</describe> </room> </rooms> <establishs> <establish> <category>0</category> <name>宽带上网</name> </establish> <establish> <category>1</category> <name>穿梭机场大巴</name> </establish> <establish> <category>2</category> <name>游泳池</name> </establish> </establishs> </hotelInfo> <hotelInfo> <ID>12345</ID> <name>广州汉庭快捷流花展酒店</name> <price>1099</price> <englishName>Days Inn Guangzhou</englishName> <imageURL>http://www.daysinngz.cn/b/a.jpg </imageURL> <describeURL>http://www.daysinngz.cn </describeURL> <introduction>酒店由著名的温德姆酒店集团旗下的美国汉庭快捷流花展酒店集团(中国)直接经营管理。 </introduction> <addrass>广州市白云区云霄路88号</addrass> <brand>汉庭快捷流花展</brand> <note>此期间预订入住,每人每晚需支付1.5欧的城市税,此费用请客人支付酒店前台 </note> <rooms> <room> <roomName>标准房</roomName> <roomType>STV</roomType> <mealPlan>单早</mealPlan> <bedType>1</bedType> <count>3</count> <amount>330</amount> <serviceFee>200.00</serviceFee> <tax>100.00</tax> <currencyCode>CNY</currencyCode> <localCurrencyCode>USD</localCurrencyCode> <exchangeRate>1.0</exchangeRate> <commisionRate>3</commisionRate> <internet>Y</internet> <describe>面积19-22平米 大、小床 免费宽带上网、健身房、游泳池</describe> </room> </rooms> <establishs> <establish> <category>0</category> <name>宽带上网</name> </establish> <establish> <category>1</category> <name>游泳池</name> </establish> <establish> <category>2</category> <name>健身房</name> </establish> </establishs> </hotelInfo> <hotelInfo> <ID>12346</ID> <name>广州海珠酒店</name> <price>855</price> <englishName>Days Inn Guangzhou</englishName> <imageURL>http://www.daysinngz.cn/b/a.jpg </imageURL> <describeURL>http://www.daysinngz.cn </describeURL> <introduction>酒店由著名的温德姆酒店集团旗下的美国海珠酒店集团(中国)直接经营管理。 </introduction> <addrass>广州市白云区云霄路88号</addrass> <brand>海珠</brand> <note>此期间预订入住,每人每晚需支付1.5欧的城市税,此费用请客人支付酒店前台 </note> <rooms> <room> <roomName>标准房</roomName> <roomType>STV</roomType> <mealPlan>单早</mealPlan> <bedType>1</bedType> <count>2</count> <amount>350</amount> <serviceFee>200.00</serviceFee> <tax>120.00</tax> <currencyCode>CNY</currencyCode> <localCurrencyCode>USD</localCurrencyCode> <exchangeRate>1.0</exchangeRate> <commisionRate>3</commisionRate> <internet>Y</internet> <describe>面积19-22平米 大、小床 免费宽带上网、停车场、健身房、游泳池</describe> </room> </rooms> <establishs> <establish> <category>0</category> <name>宽带上网</name> </establish> <establish> <category>1</category> <name>停车场</name> </establish> <establish> <category>2</category> <name>健身房</name> </establish> <establish> <category>3</category> <name>游泳池</name> </establish> </establishs> </hotelInfo> </hotelInfos> 这个是xml
xingfuzhuzi1314 2012-12-07
  • 打赏
  • 举报
回复
LZ,你 这截图,让人难以接受。 直接把代码贴上来,排版一下,这样童鞋们也好帮你测试。。 你可以遍历下这个xml,把对应记录存入到list中,之后根据你选择的,去list里面遍历就好!
ImN1 2012-12-07
  • 打赏
  • 举报
回复
希望你是个海归,感觉你的汉语很难理解 过滤掉没有选择的那一项的 是指“除了选择的那一项,其他过滤掉”么? 接着衍生的问题是,为何要做去除的大工作量,而不是做提取的少工作量呢? xpath本身只有提取而没有过滤,过滤需要结合程序语言 //hotelInfo/establishs/establish/name/text() 判断是否等于"健身房" 如果要提取有“健身房”的hotelInfo就 //hotelInfo/establishs/establish/name[text()="健身房"]/../../../ 然后……为啥要贴图呢?贴代码不行么,没代码别人就算写出来也没法测试……你自己测试吧
long95wang 2012-12-07
  • 打赏
  • 举报
回复
一楼说的很好,你直接贴代码出来,以便测试 还有就是你说的过滤,你是只要name呢?还是除了name都要?

8,906

社区成员

发帖
与我相关
我的任务
社区描述
XML/XSL相关问题讨论专区
社区管理员
  • XML/XSL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧