0
<Sections>
    <Products>
      <Transport>
        <TransportSequence>1</TransportSequence>
        <Traveller>001</Traveller>
      </Transport>
      <Transport>
        <TransportSequence>2</TransportSequence>
        <Traveller>001</Traveller>
      </Transport>
    </Products>
  </Sections>
  <Sections>
    <Products>
      <Transport>
        <TransportSequence>1</TransportSequence>
        <Traveller>002</Traveller>
      </Transport>
      <Transport>
        <TransportSequence>2</TransportSequence>
        <Traveller>002</Traveller>
      </Transport>
    </Products>
  </Sections>

一部のXMLの順序に特定の問題があります。上記の例から、TransportSequenceでのみdistinctを選択するようにフォーマットを変更する必要があります。次に、「Traveller」ノードを子として割り当てて、次のようなものを生成する必要があります。

<Sections>
   <Products>
      <Transport>
         <TransportSequence>1</TransportSequence>
         <Travellers>
            <Traveller>001</Traveller>
            <Traveller>002</Traveller>
         </Travellers>
      </Transport>
      <Transport>
         <TransportSequence>2</TransportSequence>
         <Travellers>
            <Traveller>001</Traveller>
            <Traveller>002</Traveller>
         </Travellers>
      </Transport>
   </Products>
</Sections>

もう1つの問題は、トランスポートノードには、この例には示されていない多くの子ノードと孫ノードも含まれていることです。また、TravellerSequenceに属する多くのtravllerが存在する可能性があります。TransportSequence番号も多数あります。

4

1 に答える 1

0

Saxon9やAltovaXMLなどのXSLT2.0プロセッサで実行されるXSLT2.0スタイルシートは次のとおりです。

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

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

<xsl:template match="*[Sections]">
  <xsl:copy>
    <Sections>
      <Products>
        <xsl:for-each-group select="Sections/Products/Transport" group-by="TransportSequence">
          <Transport>
            <TransportSequence><xsl:value-of select="current-grouping-key()"/></TransportSequence>
            <Travellers>
              <xsl:copy-of select="current-group()/Traveller"/>
            </Travellers>
          </Transport>
        </xsl:for-each-group>
      </Products>
    </Sections>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

変身します

<Root>
<Sections>
    <Products>
      <Transport>
        <TransportSequence>1</TransportSequence>
        <Traveller>001</Traveller>
      </Transport>
      <Transport>
        <TransportSequence>2</TransportSequence>
        <Traveller>001</Traveller>
      </Transport>
    </Products>
  </Sections>
  <Sections>
    <Products>
      <Transport>
        <TransportSequence>1</TransportSequence>
        <Traveller>002</Traveller>
      </Transport>
      <Transport>
        <TransportSequence>2</TransportSequence>
        <Traveller>002</Traveller>
      </Transport>
    </Products>
  </Sections>
</Root>

の中へ

<Root>
   <Sections>
      <Products>
         <Transport>
            <TransportSequence>1</TransportSequence>
            <Travellers>
               <Traveller>001</Traveller>
               <Traveller>002</Traveller>
            </Travellers>
         </Transport>
         <Transport>
            <TransportSequence>2</TransportSequence>
            <Travellers>
               <Traveller>001</Traveller>
               <Traveller>002</Traveller>
            </Travellers>
         </Transport>
      </Products>
   </Sections>
</Root>

[編集]答えを完成させるために、XSLT 1.0プロセッサを使用する場合、Muenchianグループ化を使用するソリューションは次のようになります。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

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

<xsl:key name="by-seq" match="Sections/Products/Transport" use="TransportSequence"/>

<xsl:template match="*[Sections]">
  <xsl:copy>
    <Sections>
      <Products>
        <xsl:for-each select="Sections/Products/Transport[generate-id() = generate-id(key('by-seq', TransportSequence)[1])]">
          <Transport>
            <xsl:copy-of select="TransportSequence"/>
            <Travellers>
              <xsl:copy-of select="key('by-seq', TransportSequence)/Traveller"/>
            </Travellers>
          </Transport>
        </xsl:for-each>
      </Products>
    </Sections>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2013-03-26T14:08:42.347 に答える