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 を取得し、この売り手の (この人の) メールアドレスを出力する必要があります。

キーemailaddressを使用して、XSLT 変換で必要な要素を取得する効率的な方法を次に示します。

<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 に答える