XPATH查询优化
我有以下xml文件XPATH查询优化,xpath,Xpath,我有以下xml文件 <site> <people> <person id="person0"> <emailaddress>0@concordia.ca</emailaddress> </person> <person id="person1"> <emailaddress>1@concordia.ca</emailaddress>
<site>
<people>
<person id="person0">
<emailaddress>0@concordia.ca</emailaddress>
</person>
<person id="person1">
<emailaddress>1@concordia.ca</emailaddress>
</person>
<person id="person2">
<emailaddress>2@concordia.ca</emailaddress>
</person>
</people>
<closed_auctions>
<closed_auction>
<annotation>123</annotation>
<seller person="person1"/>
</closed_auction>
<closed_auction>
<annotation></annotation>
<seller person="person2"/>
</closed_auction>
<closed_auction>
<annotation></annotation>
<seller person="person3"/>
</closed_auction>
</closed_auctions>
</site>
0@concordia.ca
1@concordia.ca
2@concordia.ca
123
我们有一个人员列表和一个拍卖列表,您可以看到卖家部分包含对人员id的引用
我想检查所有已关闭的_拍卖标签,如果它有非空的注释标签,我必须获得卖家的个人id并打印该卖家(此人)的电子邮件地址
当前查询如下所示:
/site/people/person[@id=/site/closed_auctions/closed_auction[annotation/text()]/seller/@person]/emailaddress/text()
对于较小的xml文件大小,此查询运行良好,但对于较大的xml文件,它永远不会结束。
(我认为问题与嵌套的xpath有关,但我找不到其他方法)
你能提出改进意见吗
多谢各位
我想检查所有已关闭的_拍卖标签,以及是否有非空标签
注释标签,我必须获得卖家id并打印电子邮件
卖方(此人)的地址
这里有一种通过XSLT转换获取想要的emailaddress
元素的有效方法——使用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kPersonById" match="person" use="@id"/>
<xsl:template match="/">
<xsl:copy-of select=
"key('kPersonById',
/*/closed_auctions/*[string(annotation)]/seller/@person)/emailaddress"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<site>
<people>
<person id="person0">
<emailaddress>0@concordia.ca</emailaddress>
</person>
<person id="person1">
<emailaddress>1@concordia.ca</emailaddress>
</person>
<person id="person2">
<emailaddress>2@concordia.ca</emailaddress>
</person>
</people>
<closed_auctions>
<closed_auction>
<annotation>123</annotation>
<seller person="person1"/>
</closed_auction>
<closed_auction>
<annotation></annotation>
<seller person="person2"/>
</closed_auction>
<closed_auction>
<annotation></annotation>
<seller person="person3"/>
</closed_auction>
</closed_auctions>
</site>
<emailaddress>1@concordia.ca</emailaddress>
0@concordia.ca
1@concordia.ca
2@concordia.ca
123
生成所需的正确结果:
<site>
<people>
<person id="person0">
<emailaddress>0@concordia.ca</emailaddress>
</person>
<person id="person1">
<emailaddress>1@concordia.ca</emailaddress>
</person>
<person id="person2">
<emailaddress>2@concordia.ca</emailaddress>
</person>
</people>
<closed_auctions>
<closed_auction>
<annotation>123</annotation>
<seller person="person1"/>
</closed_auction>
<closed_auction>
<annotation></annotation>
<seller person="person2"/>
</closed_auction>
<closed_auction>
<annotation></annotation>
<seller person="person3"/>
</closed_auction>
</closed_auctions>
</site>
<emailaddress>1@concordia.ca</emailaddress>
1@concordia.ca
运行两个查询,而不是一个查询?开始和结束标记不匹配:seller
尝试xquery:doc中的$x(“input.xml”)//person let$y:=root($x)//seller[@person=$x/@id]其中$y/./annotation/text()=“return$x/emailaddress/text()”
XSLT通过使用键提供了一个非常有效的解决方案。您对XSLT解决方案感兴趣吗?@kev谢谢,您认为这会提高性能吗?事实上,我运行了XSLT解决方案,同样:(