-1

個別のパック番号ごとに、以下のシーケンス番号のロジックについて誰か助けてください。入力:

<Move-Afile>
  <Afile>
    <Item>
      <PackNumber>1234</PackNumber>
    </Item>
    <Item>
      <PackNumber>1234</PackNumber>
    </Item>
    <Item>
      <PackNumber>1234</PackNumber>
    </Item>
    <Item>
      <PackNumber>126</PackNumber><!-- different PackNumber counter start from 1 -->
    </Item>
    <Item>
      <PackNumber>126</PackNumber>
    </Item>
    <Item>
      <PackNumber>135</PackNumber><!-- different PackNumber counter start from 1 -->
    </Item>
     <Item>
      <PackNumber>135</PackNumber>
    </Item>
  </Afile>
</Move-Afile>

<Item>無制限の要素です。各アイテム PackNumber が存在します。ここでは、一意<PackNumber>のカウンターが 1 から開始され、以下の出力のようにインクリメントされるような条件があります。

出力:

<?xml version="1.0"?>
<A>
  <target>
    <counter>1</counter>
    <PNumber>1234</PNumber>
    <counter>2</counter>
    <PNumber>1234</PNumber>
    <counter>3</counter>
    <PNumber>1234</PNumber>
    <counter>1</counter><!-- different PackNumber counter start from 1 -->
    <PNumber>126</PNumber>
    <counter>2</counter>
    <PNumber>126</PNumber>
    <counter>1</counter><!-- different PackNumber counter start from 1 -->
    <PNumber>135</PNumber>
    <counter>2</counter>
    <PNumber>135</PNumber>  
  </target>
</A> 
4

1 に答える 1

3

これを行う最善の方法は、グループ化を調べることです。たとえば、xslt-1.0 のmuenchian グループ化 http://www.jenitennison.com/xslt/grouping/muenchian.html 。

したがって、次のようなことを試すことができます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output  method="xml" indent="yes"/>
    <xsl:key name="kItem" match="Item" use="PackNumber"/>

    <xsl:template match="/*">
        <A>
            <target>
                <xsl:for-each select="Afile/Item[generate-id(.)=generate-id(key('kItem',PackNumber)[1])]">
                    <xsl:variable name="pnr" select="PackNumber" />
                    <xsl:for-each select="key('kItem', $pnr)" >
                        <counter>
                            <xsl:value-of select="position()"/>
                        </counter>
                        <PNumber>
                            <xsl:value-of select="$pnr"/>
                        </PNumber>
                    </xsl:for-each>
                </xsl:for-each>
            </target>
        </A>
    </xsl:template>

</xsl:stylesheet>

次の出力が生成されます。

<A>
  <target>
    <counter>1</counter>
    <PNumber>1234</PNumber>
    <counter>2</counter>
    <PNumber>1234</PNumber>
    <counter>3</counter>
    <PNumber>1234</PNumber>
    <counter>1</counter>
    <PNumber>126</PNumber>
    <counter>2</counter>
    <PNumber>126</PNumber>
    <counter>1</counter>
    <PNumber>135</PNumber>
    <counter>2</counter>
    <PNumber>135</PNumber>
  </target>
</A>
于 2013-07-08T19:25:12.743 に答える