2011-05-16 35 views
1

我如何基於「CorporationID」和他們組的元素進行排序的元素,並將它們組排序..如何基於獨特的元素或ID

我有一個XML有效載荷像下面的一個...

 
<corporationActions> 
    <corporationAction> 
    <ActionID>5530974</ActionID> 
    <CorporationID>1044294</CorporationID> 
    <ActionDate>2009-05-03</ActionDate> 
    <ActionType>Articles of Organization2</ActionType> 
    <ActionNotes></ActionNotes> 
    <DocumentNumber>20110258775-68</DocumentNumber> 
    <NumberofPages>4</NumberofPages> 
    </corporationAction> 
    <corporationAction> 
    <ActionID>5530975</ActionID> 
    <CorporationID>1044294</CorporationID> 
    <ActionDate>2009-05-03</ActionDate> 
    <ActionType>Miscellaneous</ActionType> 
    <ActionNotes></ActionNotes> 
    <DocumentNumber>20110258777-80</DocumentNumber> 
    <NumberofPages>2</NumberofPages> 
    </corporationAction> 
</corporationActions> 

我需要首先基於元素進行排序CorporationID,然後將它們分組,如果CorporationID s的重複..像下面paylaod

 
<corporationActions> 
    <corporationAction> 
     <CorporationID>1044294</CorporationID> 
     <corporationActionDetails> 
      <ActionID>5530974</ActionID> 
      <ActionDate>2009-05-03</ActionDate> 
      <ActionType>Articles of Organization2</ActionType> 
     </corporationActionDetails> 
     <corporationActionDetails> 
      <ActionID>5530975</ActionID> 
      <ActionDate>2009-05-03</ActionDate> 
      <ActionType>Miscellaneous</ActionType> 
     </corporationActionDetails> 
    </corporationAction> 
</corporationActions> 

感謝&問候, anvv夏爾馬

回答

1

這是分組(Muenchian法)溶液中的XSLT 1.0,即大多采用模板和推式中沒有<xsl:for-each>

<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="kcorpActByID" match="corporationAction" 
    use="CorporationID"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"> 
     <xsl:sort select="CorporationID" data-type="number"/> 
     </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"corporationAction|CorporationID 
|ActionNotes|DocumentNumber|NumberofPages"/> 

<xsl:template match= 
    "corporationAction 
    [generate-id() 
    = 
    generate-id(key('kcorpActByID', CorporationID)[1]) 
    ]"> 
    <corporationAction> 
    <xsl:copy-of select="CorporationID"/> 
    <xsl:apply-templates mode="copy" 
    select="key('kcorpActByID',CorporationID)" /> 
    </corporationAction> 
</xsl:template> 

<xsl:template match="corporationAction" mode="copy"> 
    <corporationActionDetails> 
    <xsl:apply-templates/> 
    </corporationActionDetails> 
</xsl:template> 
</xsl:stylesheet> 

當這變換應用到提供的XML文檔:

<corporationActions> 
    <corporationAction> 
    <ActionID>5530974</ActionID> 
    <CorporationID>1044294</CorporationID> 
    <ActionDate>2009-05-03</ActionDate> 
    <ActionType>Articles of Organization2</ActionType> 
    <ActionNotes></ActionNotes> 
    <DocumentNumber>20110258775-68</DocumentNumber> 
    <NumberofPages>4</NumberofPages> 
    </corporationAction> 
    <corporationAction> 
    <ActionID>5530975</ActionID> 
    <CorporationID>1044294</CorporationID> 
    <ActionDate>2009-05-03</ActionDate> 
    <ActionType>Miscellaneous</ActionType> 
    <ActionNotes></ActionNotes> 
    <DocumentNumber>20110258777-80</DocumentNumber> 
    <NumberofPages>2</NumberofPages> 
    </corporationAction> 
</corporationActions> 

想要的,正確的結果產生

<corporationActions> 
    <corporationAction> 
     <CorporationID>1044294</CorporationID> 
     <corporationActionDetails> 
     <ActionID>5530974</ActionID> 
     <ActionDate>2009-05-03</ActionDate> 
     <ActionType>Articles of Organization2</ActionType> 
     </corporationActionDetails> 
     <corporationActionDetails> 
     <ActionID>5530975</ActionID> 
     <ActionDate>2009-05-03</ActionDate> 
     <ActionType>Miscellaneous</ActionType> 
     </corporationActionDetails> 
    </corporationAction> 
</corporationActions> 

請注意:增加的靈活性,由於其所使用的和壓倒一切身份模板。與之相比,我們使用<xsl:copy-of select="ActionID|ActionDate|ActionType"/><xsl:apply-templates/>,這可以確保當前節點的任何子節點都可以按照我們想要的任何方式進行處理(並進一步在單獨的模板中進行指定)。

二, XSLT 2.0解決方案

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*"> 
    <xsl:for-each-group select="corporationAction" 
     group-by="CorporationID"> 
    <xsl:sort select="number(CorporationID)"/> 

    <corporationAction> 
    <xsl:sequence select="CorporationID"/> 
    <xsl:apply-templates mode="copy" 
    select="current-group()" /> 
    </corporationAction> 
    </xsl:for-each-group> 
</xsl:template> 

<xsl:template match="corporationAction" mode="copy"> 
    <corporationActionDetails> 
    <xsl:apply-templates/> 
    </corporationActionDetails> 
</xsl:template> 

    <xsl:template match= 
"corporationAction|CorporationID 
|ActionNotes|DocumentNumber|NumberofPages"/> 
</xsl:stylesheet> 

請注意:使用<xsl:for-each-group>current-group()功能簡化分組。

0

此解決方案使用Muenchian方法:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:output indent="yes"/> 

<xsl:key name="bycorporationid" match="corporationActions/corporationAction" use="CorporationID"/> 

<xsl:template match="corporationActions"> 
    <corporationActions> 
    <xsl:for-each select="corporationAction[count(. | key('bycorporationid', CorporationID)[1]) = 1]"> 

    <xsl:sort select="CorporationID" /> 

    <corporationAction> 
     <CorporationID><xsl:value-of select="CorporationID"/></CorporationID> 

     <xsl:for-each select="key('bycorporationid',CorporationID)"> 
     <corporationActionDetails> 
      <xsl:copy-of select="ActionID"/> 
      <xsl:copy-of select="ActionDate"/> 
      <xsl:copy-of select="ActionType"/> 
     </corporationActionDetails> 
     </xsl:for-each> 

    </corporationAction> 

    </xsl:for-each> 
    </corporationActions> 
</xsl:template> 

</xsl:stylesheet> 
+0

上面的xslt不起作用,如果我在相應的xml中有命名空間,例如 – anvv 2011-07-01 07:10:12

+0

顯然不是,這在您的問題中沒有提及,也不能從您的輸入示例中推導出來。如果您無法自行解決問題,請根據新要求擴展問題。我們將看到如何解決它。 – 2011-07-01 07:14:45

+0

< ns0:USERUBSCRIBERS> 237 NV0511201114 207 237 NV0511201119 212 anvv 2011-07-01 07:14:53