0

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

我们有一个人员列表和一个拍卖列表,如您所见,卖家部分包含对人员 ID 的引用

我想检查所有 closed_auction 标签,如果它有非空注释标签,我必须获取卖家人员 ID 并打印此卖家(此人的)的电子邮件地址

当前查询如下所示:

/site/people/person[@id=/site/closed_auctions/closed_auction[annotation/text()]/seller/@person]/emailaddress/text()

此查询适用于小 xml 文件大小,但它永远不会结束大 xml 文件。(我认为问题与嵌套的 xpath 有关,但我找不到任何其他方法)

你能建议任何改进吗

谢谢

4

1 回答 1

1

我想检查所有 closed_auction 标签,如果它有非空注释标签,我必须获取卖家人员 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>
于 2013-03-21T14:33:07.060 回答