xml - 我们如何在 XPATH 1.0 中获得最长预订?
问题描述
如何使用属性StartDate和EndDate获取预订时间最长的人的姓名, 我提到了 xml 虚拟数据,我有 12 个不同的数据和更多的人,我用于 xpath 的版本是 1.0
<rent number="101111">
<car>
<startDate>2018-02-08</startDate>
<endDate>2018-03-05</endDate>
<Location>Toranto</Location>
<carType>BMW</carType>
<transmissionType>Automatic</transmissionType>
</car>
<person>
<licenseNumber> 02389749372 </licenseNumber>
<name>Alexa Steve</name>
<dob>1999-03-01</dob>
<phone>
<type>Home</type>
<number>44 010 1111 4567</number>
</phone>
<email> Alexa@steve.ca</email>
</person>
<price>
<Rate>100.50</Rate>
</price>
</rent>
<rent number="103311">
<car>
<startDate>2018-07-01</startDate>
<endDate>2018-09-05</endDate>
<Location>ottawa</Location>
<carType>audi 8</carType>
<transmissionType>Automatic</transmissionType>
</car>
<person>
<licenseNumber> 033329372 </licenseNumber>
<name>mike lornco</name>
<dob>1960-03-03</dob>
<phone>
<type>Home</type>
<number>44 010 1111 3333</number>
</phone>
<email> mikelornokorenco@gmail.com</email>
</person>
<price>
<Rate>300.50</Rate>
</price>
</rent>
到目前为止我做了什么:
/rent/StartDate[not(text() <= preceding-sibling::StartDate/text()) and not(text() <=following-sibling::StartDate/text())]
但它不工作也许我错过了任何帮助?
我们如何获得预订最长的人的姓名?
解决方案
重复主题?请参阅:我们如何使用 1.0 版加入 XPATH?
我处理过这个数据样本:
<data>
<rent number="101111">
<car>
<startDate>2018-02-08</startDate>
<endDate>2018-03-05</endDate>
<Location>Toranto</Location>
<carType>BMW</carType>
<transmissionType>Automatic</transmissionType>
</car>
<person>
<licenseNumber> 02389749372 </licenseNumber>
<name>Alexa Steve</name>
<dob>1999-03-01</dob>
<phone>
<type>Home</type>
<number>44 010 1111 4567</number>
</phone>
<email> Alexa@steve.ca</email>
</person>
<price>
<Rate>100.50</Rate>
</price>
</rent>
<rent number="103311">
<car>
<startDate>2018-07-01</startDate>
<endDate>2018-09-05</endDate>
<Location>ottawa</Location>
<carType>audi 8</carType>
<transmissionType>Automatic</transmissionType>
</car>
<person>
<licenseNumber> 033329372 </licenseNumber>
<name>mike lornco</name>
<dob>1960-03-03</dob>
<phone>
<type>Home</type>
<number>44 010 1111 3333</number>
</phone>
<email> mikelornokorenco@gmail.com</email>
</person>
<price>
<Rate>300.50</Rate>
</price>
</rent>
</data>
对于具有 2 个rent 元素的 XML,使用它来获得最长的预订:
//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","")]|//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","")]
对于具有 3 个或更多租用元素的 XML,使用它来获得最长的预订:
//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","")]|//rent[1][translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","")]]|//rent[last()][translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","")]]
使用http://www.xpathtester.com/xpath进行测试
编辑:这些表达式将获得最长的预订。要获取人名,在表达式的某些部分需要“//name”。如有需要,我稍后会添加。
编辑 2: XPath 表达式来获取最长预订人的姓名:
对于 2 个租金元素:
//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","")]//name/text()|//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","")]//name/text()
对于 3 个或更多租金元素:
//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","")]//name/text()|//rent[1][translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","")]]//name/text()|//rent[last()][translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=//rent[translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./following::endDate,"-","")-translate(./following::startDate,"-","") and translate(.//endDate,"-","")-translate(.//startDate,"-","")>=translate(./preceding::endDate,"-","")-translate(./preceding::startDate,"-","")]]//name/text()
样本数据的输出:mike lornco
推荐阅读
- python - 如何在使用“A”打印功能时“打印”列表中的每个元素?
- alexa - Alexa 的 AMAZON.LITERAL 插槽不返回任何内容
- javascript - 即使禁用提交按钮,表单也提交了两次
- arrays - 如何使用 powershell 序列化哈希表/数组中的列表?
- php - 如果我的数据库为空,则显示警告
- php - 很少有表单值没有通过 $_POST 获取
- android - 共享按钮不与 facebook 一起运行(文本为空)
- sql - 无法确定“ORA-00906:缺少左括号”的原因
- php - Php Mail 未从我的服务器发送
- ios - Unity iOS 构建最佳实践