2017-09-19 25 views
0

我已經有了一個新問題。 我必須通過xsl合併列表,問題在於查找列表中的鍵必須由2個值聯合。 這些列表可能相對較大,數千甚至數萬甚至更多的條目在這兩個列表中。在此列表的大尺寸之前,我必須關注性能和內存。這可能會在稍後在Web服務客戶端中實現,因此它必須快速且節省資源。XSL for-each filter來自其他主節點的子上下文

合併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> 

第一部分,找到兩個列表中現有的部分已經完成。 第二部分是在列表1到列表2中找到不存在的部分,並將列表2列出到列表1中。 我希望在for-each中這樣做,因此您只能從List1中獲取不存在的條目,該條目不存在在List2中。 我的問題是要從LookupList中的所有數據中查找帶有concatinated關鍵字的每個上下文。

<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

我會使用鍵交叉引用,在這裏是樣式表(由撒克遜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> 

爲了您的樣本數據,我得到

<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 3.0和組合鍵是不是強制性的,你還可使用XSLT 2.0並使用單個鍵值concat(KeyPart1, KeyPart2)

+0

試過,效果很好,非常感謝。 –