2017-10-05 175 views
0

鑑於下列XML作爲輸入匹配,附加數據噸的元素,在此基礎上精確元件

<?xml version="1.0" encoding="UTF-8"?> 
<TABLE NAME="TABLE.DB"> 
    <DATA RECORDS="2"> 
     <RECORD ID="4"> 
      <RECNO>0</RECNO> 
      <SEQ>0</SEQ> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10354</NUMBER> 
      <CN>PL</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>0</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
      <TOTALS>1</TOTALS> 
     </RECORD> 
     <RECORD ID="3"> 
      <RECNO>1</RECNO> 
      <SEQ>0</SEQ> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10355</NUMBER> 
      <CN>PL</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>0</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
      <TOTALS>1</TOTALS> 
     </RECORD> 
     <RECORD ID="2"> 
      <RECNO>2</RECNO> 
      <SEQUENCE>0</SEQUENCE> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10356</NUMBER> 
      <CN>PL 300 L</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>10</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
      <SUB_A>Some random data not matched.</SUB_A> 
     </RECORD> 
     <RECORD ID="1"> 
      <RECNO>3</RECNO> 
      <SEQUENCE>0</SEQUENCE> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10357</NUMBER> 
      <CN>PL 300 L</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>10</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
      <TOTALS>19837</TOTALS> 
     </RECORD> 
     <RECORD ID="0"> 
      <RECNO>3</RECNO> 
      <SEQUENCE>0</SEQUENCE> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10358</NUMBER> 
      <CN>PL 300 L</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>10</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
     </RECORD> 
    </DATA> 
</TABLE> 

和下面的標籤分離的文件:

[yet another value.]\t10358 
value i'd like to add\t10355 
(another) value i'd like to add\t10357 

我用\噸,爲了以顯示標籤在文件中的位置。我想將第一列中找到的數據追加到我嘗試匹配的元素中,在這種情況下,這在NUMBER中。

因此,如果NUMBER等於第二列,請在第一列中追加找到的值,使用|作爲分隔符。

一個怎麼可能有如下的結果,但保持的記錄的順序,對元件輸出排序:

 <?xml version="1.0" encoding="UTF-8"?> 
<TABLE NAME="TABLE.DB"> 
    <DATA RECORDS="2"> 
      <RECORD ID="0"> 
      <RECNO>3</RECNO> 
      <SEQUENCE>0</SEQUENCE> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10358 | [yet another value.]</NUMBER> 
      <CN>PL 300 L</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>10</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
     </RECORD> 
     <RECORD ID="1"> 
      <RECNO>3</RECNO> 
      <SEQUENCE>0</SEQUENCE> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10357 | (another) value i'd like to add</NUMBER> 
      <CN>PL 300 L</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>10</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
      <TOTALS>19837</TOTALS> 
     </RECORD> 
     <RECORD ID="2"> 
      <RECNO>2</RECNO> 
      <SEQUENCE>0</SEQUENCE> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10356</NUMBER> 
      <CN>PL 300 L</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>10</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
      <SUB_A>Some random data not matched.</SUB_A> 
     </RECORD> 
     <RECORD ID="3"> 
      <RECNO>1</RECNO> 
      <SEQ>0</SEQ> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10355 | value i'd like to add</NUMBER> 
      <CN>PL</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>0</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
      <TOTALS>1</TOTALS> 
     </RECORD> 
     <RECORD ID="4"> 
      <RECNO>0</RECNO> 
      <SEQ>0</SEQ> 
      <DATE>17/12/1999 2:44:08 μμ</DATE> 
      <ID>12/11/2015 3:15:25 μμ</ID> 
      <NUMBER>10354</NUMBER> 
      <CN>PL</CN> 
      <PROPERTY>0</PROPERTY> 
      <DAYS>0</DAYS> 
      <CURRENTSTATUS>0</CURRENTSTATUS> 
      <TOTALS>1</TOTALS> 
     </RECORD> 
    </DATA> 
</TABLE> 

我使用撒克遜最新,V 9.8

+0

是您發佈的O輸出你想要嗎?目前還不清楚排序標準是什麼,輸入和發佈的輸出似乎具有相同的順序。 –

+0

輸出是我想要的,在我的真實數據中,如果我對NUMBER進行排序,那麼輸出將記錄搞亂,我想對RECORD ID編號和輸出結果進行排序。所以在xsl中,我按照RECORD ID,NUMBER和結果排序,我需要按照RECORD ID號碼排序 – sadoyc

+0

而不是直接從xsl:merge store中將結果存儲到變量中,然後對變量的內容進行排序,請參閱https://www.w3.org/TR/xslt-30/#sorting,即對變量使用'xsl:perform-sort/xsl:sort'或使用'xsl:for-每個/ XSL:sort'。 –

回答

0

xsl:merge類似於你剛纔的問題,並進行排序合併的結果,你可以簡單地包裹xsl:mergexsl:perform-sort

<?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" 
    expand-text="yes" version="3.0"> 

    <xsl:param name="text-uri" as="xs:string">test2017100602.txt</xsl:param> 

    <xsl:mode on-no-match="shallow-copy"/> 

    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:variable name="lines" as="element(line)*"> 
     <xsl:apply-templates select="unparsed-text-lines($text-uri)"/> 
    </xsl:variable> 

    <xsl:template match=".[. instance of xs:string]"> 
     <xsl:variable name="tokens" as="xs:string*" select="tokenize(., '&#9;')[normalize-space()]"/> 
     <line number="{$tokens[2]}">{$tokens[1]}</line> 
    </xsl:template> 

    <xsl:template match="TABLE/DATA"> 
     <xsl:copy> 
      <xsl:copy-of select="@*"/> 
      <xsl:perform-sort> 
       <xsl:sort select="xs:integer(@ID)"/> 
       <xsl:merge> 
        <xsl:merge-source name="record" select="RECORD"> 
         <xsl:merge-key select="NUMBER"/> 
        </xsl:merge-source> 
        <xsl:merge-source name="line" select="$lines" sort-before-merge="yes"> 
         <xsl:merge-key select="@number"/> 
        </xsl:merge-source> 
        <xsl:merge-action> 
         <xsl:if test="current-merge-group('record')"> 
          <xsl:copy> 
           <xsl:apply-templates select="@*, NUMBER/preceding-sibling::*"/> 
           <NUMBER> 
            <xsl:value-of select="NUMBER, current-merge-group()[2]" 
             separator=" | "/> 
           </NUMBER> 
           <xsl:apply-templates select="NUMBER/following-sibling::*"/> 
          </xsl:copy> 
         </xsl:if> 
        </xsl:merge-action> 
       </xsl:merge> 
      </xsl:perform-sort> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet>