как сортировать элементы и группировать их по уникальному элементу или идентификатору - PullRequest
1 голос
/ 16 мая 2011

как мне отсортировать элементы на основе "CorporationID" и сгруппировать их ..

У меня есть полезная нагрузка 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>

Спасибо и С уважением, анвв шарма

Ответы [ 2 ]

1 голос
/ 16 мая 2011

Это решение для группировки XSLT 1.0 (метод Мюнхена), которое в основном использует push-стиль с использованием шаблонов, а не <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>

Do note : дополнительная гибкость благодаря использованию и переопределению шаблона идентификации.В отличие от <xsl:copy-of select="ActionID|ActionDate|ActionType"/> мы используем: <xsl:apply-templates/>, и это гарантирует, что любой из дочерних элементов текущего узла может быть обработан любым способом, который мы хотим (и дополнительно указать в отдельных шаблонах).

II.Решение 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 голосов
/ 16 мая 2011

Это решение использует метод Мюнхена:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...