2017-09-19 4 views
0

私はすでに新しい問題を抱えています。 私はxsl経由でリストをマージしなければなりません。この問題は、ルックアップリストのキーが2つの値でconcatinatedされなければならないということです。 リストは相対的に大きく、数千、数千、場合によっては両方のリストのエントリがさらに大きくなります。このリストのサイズが大きくなる前に、私はパフォーマンスとメモリを調べなければなりません。これは後でWebサービスクライアントで実装されるため、迅速かつリソースを節約する必要があります。他のメインノードからのサブコンテキストを持つXSL for-eachフィルタ

List1とList2の既存の要素をマージして複雑ではありませんでしたが、他のリストの存在しない要素で両方のリストをチェックする必要があります。 for-each select文を無効にしようとしましたが失敗しました。おそらく間違った方法です。

InputXML-例

<ROOT> 
    <getObjectListResponse> 
     <item> 
      <Key>1111111:aaaa</Key> 
      <someOhterData>Text</someOhterData> 
     </item> 
     <item> 
      <Key>2222222:bbbb</Key> 
      <someOhterData>Text</someOhterData> 
     </item> 
     <item> 
      <Key>3333333:aaaa</Key> 
      <someOhterData>Text</someOhterData> 
     </item> 
    </getObjectListResponse> 
    <LookupList> 
     <DATA> 
      <KeyPart1>1111111</KeyPart1> 
      <KeyPart2>aaaa</KeyPart2> 
      <someOhterData>Text</someOhterData> 
     </DATA> 
     <DATA> 
      <KeyPart1>1111111</KeyPart1> 
      <KeyPart2>bbbb</KeyPart2> 
      <someOhterData>Text</someOhterData> 
     </DATA> 
     <DATA> 
      <KeyPart1>2222222</KeyPart1> 
      <KeyPart2>aaaa</KeyPart2> 
      <someOhterData>Text</someOhterData> 
     </DATA> 
     <DATA> 
      <KeyPart1>2222222</KeyPart1> 
      <KeyPart2>bbbb</KeyPart2> 
      <someOhterData>Text</someOhterData> 
     </DATA> 
     <DATA> 
      <KeyPart1>3333333</KeyPart1> 
      <KeyPart2>aaaa</KeyPart2> 
      <someOhterData>Text</someOhterData> 
     </DATA> 
     <DATA> 
      <KeyPart1>3333333</KeyPart1> 
      <KeyPart2>bbbb</KeyPart2> 
      <someOhterData>Text</someOhterData> 
     </DATA> 
    </LookupList> 
</ROOT> 

最初の部分、両方のリスト内の既存の部品がすでに行われて見つけます。 2番目の部分は、リスト1からリスト2、リスト2からリスト1への存在しない部分を見つけることです。 for-eachでこれを行いたいので、List1から存在しないエントリのみを取得しますリスト2にある。 問題は、LookupListのすべてのDATAからconcatinatedキーを使ってfor-eachコンテキストを検索することです。

<xsl:for-each select="/*/getObjectListResponse/item[Key/text() != /*/LookupList/DATA/*[concat(KeyPart1,'/',KeyPart2)]]"> 
       <xsl:copy-of select="."/>   
      </xsl:for-each> 

<xsl:for-each select="/*/getObjectListResponse/item[Key/text() != /*/LookupList/DATA/[concat(KeyPart1,'/',KeyPart2)]]"> 
       <xsl:copy-of select="."/>   
      </xsl:for-each>  

しかし、私が試したすべてが失敗し、結果も間違っています。

どうすればいいですか?

私はこれを試しましたが、他のものも試しましたが、何も動作しません。予め

おかげ

答えて

2
I相互参照のためにキーを使用する

は、ここで明らかに一つのサンプルとして、スタイルシート(サクソン9.8すべてのエディションまたはのAltovaのXMLSpy /ラプターによって支持されるように)XSLT 3.0であり、良好なユースケースであります複合キーのために:あなたのサンプルデータについては

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:output indent="yes"/> 

    <xsl:key name="data" match="DATA" composite="true" use="KeyPart1, KeyPart2"/> 

    <xsl:key name="item" match="item" use="Key"/> 

    <xsl:template match="ROOT"> 
     <xsl:copy> 
      <items-not-in-data> 
       <xsl:copy-of select="getObjectListResponse/item[not(key('data', (substring-before(Key, ':'), substring-after(Key, ':'))))]"/> 
      </items-not-in-data> 
      <data-not-in-items> 
       <xsl:copy-of select="LookupList/DATA[not(key('item', concat(KeyPart1, ':', KeyPart2)))]"/> 
      </data-not-in-items> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

私はもちろんXSLT 3.0の

<ROOT> 
    <items-not-in-data/> 
    <data-not-in-items> 
     <DATA> 
           <KeyPart1>1111111</KeyPart1> 
           <KeyPart2>bbbb</KeyPart2> 
           <someOhterData>Text</someOhterData> 
        </DATA> 
     <DATA> 
           <KeyPart1>2222222</KeyPart1> 
           <KeyPart2>aaaa</KeyPart2> 
           <someOhterData>Text</someOhterData> 
        </DATA> 
     <DATA> 
           <KeyPart1>3333333</KeyPart1> 
           <KeyPart2>bbbb</KeyPart2> 
           <someOhterData>Text</someOhterData> 
        </DATA> 
    </data-not-in-items> 
</ROOT> 

を取得し、複合キーは必須ではありませんが、あなたにもXSLT 2.0を使用することができます単一のキー値concat(KeyPart1, KeyPart2)を使用します。

+0

お試しいただきありがとうございます。 –

関連する問題