Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPATH查询优化_Xpath - Fatal编程技术网

XPATH查询优化

XPATH查询优化,xpath,Xpath,我有以下xml文件 <site> <people> <person id="person0"> <emailaddress>0@concordia.ca</emailaddress> </person> <person id="person1"> <emailaddress>1@concordia.ca</emailaddress>

我有以下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>

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解决方案,同样:(