2016-05-16 301 views
1

下面是我的輸入xml,我想用xslt 1.0轉換爲下面指定的xml。如何使用重複元素在多行中組合元素

元REF需要被用作鍵合併並創建在輸出 輸入XML陣列:

<Input> 
    <row> 
     <Name>ABC</Name> 
     <Ref>12345</Ref> 
     <Status>O</Status> 
     <Currency>USD</Currency> 
     <Date>2016-05-16</Date> 
    </row> 
    <row> 
     <Name>ABC</Name> 
     <Ref>12345</Ref> 
     <Status>O</Status> 
     <Currency>AUD</Currency> 
     <Date>2016-05-01</Date> 
    </row> 
    <row> 
     <Name>XYZ</Name> 
     <Ref>54321</Ref> 
     <Status>O</Status> 
     <Currency>AUD</Currency> 
     <Date>2016-03-01</Date> 
    </row> 
    <row> 
     <Name>XYZ</Name> 
     <Ref>54321</Ref> 
     <Status>O</Status> 
     <Currency>USD</Currency> 
     <Date>2016-05-01</Date> 
    </row> 
</Input> 

輸出XML:在所述請求中使用ref元件會有隻有兩個行元素在輸出xml中,但是不同的值在另一個子節點中分枝。

<Output> 
    <row> 
     <Name>ABC</Name> 
     <Ref>12345</Ref> 
     <Status>O</Status> 
     <Details> 
       <Detail> 
        <Currency>USD</Currency> 
        <Date>2016-05-16</Date> 
       </Detail> 
       <Detail> 
        <Currency>AUD</Currency> 
        <Date>2016-05-01</Date> 
       </Detail> 
      </Details> 
    </row> 
    <row> 
     <Name>XYZ</Name> 
     <Ref>54321</Ref> 
     <Status>O</Status> 
     <Details> 
       <Detail> 
        <Currency>AUD</Currency> 
         <Date>2016-03-01</Date> 
       </Detail> 
       <Detail> 
        <Currency>USD</Currency> 
        <Date>2016-05-01</Date> 
       </Detail> 
     </Details> 
    </row> 
</Output> 

任何幫助?

使用下面的XSLT試過,但如果條件不工作

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
<xsl:output method="xml" version="1.0"/> 
<xsl:template match="/"> 
<xsl:element name="Output"> 
    <xsl:apply-templates select="Input"/> 
</xsl:element> 
</xsl:template> 
<xsl:template match="Input"> 
<xsl:for-each select="row"> 
    <xsl:if test="(following-sibling::Ref = /Ref)"> 
     <xsl:element name="row"> 
      <xsl:element name="Name"> 
       <xsl:value-of select="Name" /> 
      </xsl:element> 
      <xsl:element name="Ref"> 
       <xsl:value-of select="Ref" /> 
      </xsl:element> 
      <xsl:element name="Status"> 
       <xsl:value-of select="Status" /> 
      </xsl:element> 
      <xsl:element name="Details"> 
       <xsl:element name="Detail"> 
       <xsl:element name="Currency"> 
        <xsl:value-of select="Currency" /> 
       </xsl:element> 
       <xsl:element name="Date"> 
        <xsl:value-of select="Date" /> 
       </xsl:element> 
       </xsl:element> 
      </xsl:element> 
     </xsl:element> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
+0

請出示您已經編寫了XSLT和它產生的輸出。 –

+0

添加了我正在處理的xslt,但與If條件相關的一些問題, – user6341824

+0

這是另一個分組問題 - 請參閱:http://www.jenitennison.com/xslt/grouping/muenchian.html –

回答

1

該轉化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:key name="kRowByRefNameStat" match="row" use="concat(Name, '|', Ref, '|', Status)"/> 

    <xsl:template match="/*"> 
    <Output> 
     <xsl:apply-templates select= 
     "row[generate-id() 
     = 
     generate-id(key('kRowByRefNameStat', 
         concat(Name, '|', Ref, '|', Status))[1])]"/> 
    </Output> 
    </xsl:template> 
    <xsl:template match="row"> 
    <row> 
     <xsl:copy-of select="Name | Ref | Status"/> 
     <Details> 
      <xsl:apply-templates mode="inGroup" select= 
      "key('kRowByRefNameStat', concat(Name, '|', Ref, '|', Status))"/> 
     </Details> 
    </row> 
    </xsl:template> 
    <xsl:template match="row" mode="inGroup"> 
    <Detail><xsl:copy-of select="Currency | Date"/></Detail> 
    </xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔施加:

<Input> 
    <row> 
     <Name>ABC</Name> 
     <Ref>12345</Ref> 
     <Status>O</Status> 
     <Currency>USD</Currency> 
     <Date>2016-05-16</Date> 
    </row> 
    <row> 
     <Name>ABC</Name> 
     <Ref>12345</Ref> 
     <Status>O</Status> 
     <Currency>AUD</Currency> 
     <Date>2016-05-01</Date> 
    </row> 
    <row> 
     <Name>XYZ</Name> 
     <Ref>54321</Ref> 
     <Status>O</Status> 
     <Currency>AUD</Currency> 
     <Date>2016-03-01</Date> 
    </row> 
    <row> 
     <Name>XYZ</Name> 
     <Ref>54321</Ref> 
     <Status>O</Status> 
     <Currency>USD</Currency> 
     <Date>2016-05-01</Date> 
    </row> 
</Input> 

產生想要的,正確的結果:使用複合密鑰

    1. Muenchian grouping

      <Output> 
          <row> 
           <Name>ABC</Name> 
           <Ref>12345</Ref> 
           <Status>O</Status> 
           <Details> 
           <Detail> 
            <Currency>USD</Currency> 
            <Date>2016-05-16</Date> 
           </Detail> 
           <Detail> 
            <Currency>AUD</Currency> 
            <Date>2016-05-01</Date> 
           </Detail> 
           </Details> 
          </row> 
          <row> 
           <Name>XYZ</Name> 
           <Ref>54321</Ref> 
           <Status>O</Status> 
           <Details> 
           <Detail> 
            <Currency>AUD</Currency> 
            <Date>2016-03-01</Date> 
           </Detail> 
           <Detail> 
            <Currency>USD</Currency> 
            <Date>2016-05-01</Date> 
           </Detail> 
           </Details> 
          </row> 
      </Output> 
      

      說明 Modes