0

Shipment には注文数が存在します。注文ごとに、多数の注文明細があります。オーダー ライン アイテムにはアイテムが含まれています。反復ごとに、階層レベルを維持しています。orderLine Items セクションで、前のアイテムが現在のアイテムと等しい場合、階層をインクリメントする必要はありません。

ポイント:

  1. 入荷は1個のみです
  2. 出荷ごとに注文数が表示されます。
  3. 注文ごとの orderLineItems の数。
  4. 注文と orderlineItems の反復ごとに、階層レベルを維持する必要があります (増分値)。必要な以下の出力のような階層レベル。

    以下は入力です。
    入力:


        <shipment>
 <order><!-- unbounded -->
  <value>value 4</value>
  <other>item1</other>
 <OrderLineItems><!-- unbounded -->(conditions comes under this section only not in Order section)
         <Lineitem>3</LineItem>
</OrderLineItems>
<OrderLineItems>
         <Lineitem>3</LineItem>
</OrderLineItems>
<OrderLineItems>
         <Lineitem>2</LineItem>
</OrderLineItems>        
         </order>

 <order>
  <value>value 98</value>
  <other>item2</other>
 <OrderLineItems>
         <Lineitem>8</LineItem>
</OrderLineItems>
<OrderLineItems>
         <Lineitem>3</LineItem>
</OrderLineItems>
<OrderLineItems>
         <Lineitem>4</LineItem>
</OrderLineItems>
 </order>

  <order>
  <value>value 98</value>
  <other>item2</other>
  <OrderLineItems>
         <Lineitem>8</LineItem>
</OrderLineItems>
<OrderLineItems>
         <Lineitem>3</LineItem>
</OrderLineItems>
<OrderLineItems>
         <Lineitem>4</LineItem>
</OrderLineItems>
 </order>
</shipment>

以下は、必要な出力です。

出力:

<ns1:Shipment>
   <ns1:Shipment1>1</ns1:Shipment1>
   <ns1:ShipmentValue>S</ns1:ShipmentValue>
   <ns1:Order>
      <ns1:Orderlevel1>2</ns1:Orderlevel1>
      <ns1:Orderlevel2>1</ns1:Orderlevel2>
      <ns1:Orderlevel3>O</ns1:Orderlevel3>
      <ns1:OrderLineItems>
         <ns1:Level1>3</ns1:Level1>
         <ns1:Level2>2</ns1:Level2>
         <ns1:Level3>I</ns1:Level3>
         <ns1:Item>Item59</ns1:Item>
      </ns1:OrderLineItems>
      <ns1:OrderLineItems>
         <ns1:Item>Item59</ns1:Item>
      </ns1:OrderLineItems>
       <ns1:OrderLineItems>
        <ns1:Level1>4</ns1:Level1>
         <ns1:Level2>2</ns1:Level2>
         <ns1:Level3>I</ns1:Level3>
         <ns1:Item>Item63</ns1:Item>
      </ns1:OrderLineItems>
   </ns1:Order>
   <ns1:Order>
      <ns1:Orderlevel1>5</ns1:Orderlevel1>
      <ns1:Orderlevel2>1</ns1:Orderlevel2>
      <ns1:Orderlevel3>O</ns1:Orderlevel3>
      <ns1:OrderLineItems>
         <ns1:Level1>6</ns1:Level1>
         <ns1:Level2>5</ns1:Level2>
         <ns1:Level3>I</ns1:Level3>
         <Item>Item74</Item>
      </ns1:OrderLineItems>
       <ns1:OrderLineItems>
       <ns1:Level1>7</ns1:Level1>
         <ns1:Level2>5</ns1:Level2>
         <ns1:Level3>I</ns1:Level3>
        <Item>Item78</Item>
      </ns1:OrderLineItems>   
      <ns1:OrderLineItems>
         <ns1:Item>Item78</ns1:Item>
      </ns1:OrderLineItems>
 </ns1:Order>
</ns1:Shipment>

4

1 に答える 1

0

私はあなたの問題を単純化しました(私はそれを正しく理解していると仮定していますが、私にはわかりません)。

とにかく、この XML の場合:

<shipment>
 <order>
  <value>value 4</value>
  <other>item1</other>
 </order>
 <order>
  <value>value 98</value>
  <other>item2</other>
 </order>
 <order>
  <value>value 98</value>
  <other>item3</other>
 </order>
 <order>
  <value>another value</value>
  <other>item4</other>
 </order>
</shipment>

次の出力が得られます (変更<counter>されるたびに増加する要素に注意してください)。<value>

<shipment>
   <order>
      <counter>1</counter>
      <value>value 4</value>
      <other>item1</other>
   </order>
   <order>
      <!-- counter incremented, because value changed
           from "value 4" to "value 98" -->
      <counter>2</counter>
      <value>value 98</value>
      <other>item2</other>
   </order>
   <order>
      <!-- counter not incremented, value still "value 98" -->
      <counter>2</counter>
      <value>value 98</value>
      <other>item3</other>
   </order>
   <order>
      <!-- counter incremented, because value changed
           from "value 98" to "another value" -->
      <counter>3</counter>
      <value>another value</value>
      <other>item4</other>
   </order>
</shipment>

それがあなたにとって有用なものである場合は、このスタイルシートを見てください:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

<xsl:template match="/">
  <shipment>
    <!-- call template for first <order> only. All subsequent <order>
         elements will be called recursively by this template itself -->
    <xsl:call-template name="order">
      <xsl:with-param name="prevValue" select="string('')"/>
      <xsl:with-param name="counter" select="0"/>
      <xsl:with-param name="self" select="/shipment/order[1]"/>
    </xsl:call-template>
  </shipment>
</xsl:template>

<xsl:template name="order">
  <xsl:param name="prevValue"/>
  <xsl:param name="counter"/>
  <xsl:param name="self"/>

  <xsl:variable name="selfCounter">
    <xsl:choose>
      <!-- if the <value> is the same as in previous <order>, 
           do not increment <counter> -->
      <xsl:when test="$prevValue = $self/value">
        <xsl:value-of select="$counter"/>
      </xsl:when>
      <!-- if the value is different, increment <counter> by one -->
      <xsl:otherwise>
        <xsl:value-of select="$counter + 1"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>

  <order>
    <!-- copy all the original children of <order>,
         and add <counter> -->
    <counter><xsl:value-of select="$selfCounter"/></counter>
    <xsl:copy-of select="$self/node()" />
  </order>

  <!-- if there is another <order>, call this template -->
  <xsl:if test="$self/following-sibling::order[1]">
        <xsl:call-template name="order">
          <xsl:with-param name="prevValue" select="$self/value"/>
          <xsl:with-param name="counter" select="$selfCounter"/>
          <xsl:with-param name="self" select="$self/following-sibling::order[1]"/>
        </xsl:call-template>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>
于 2013-03-19T21:56:28.113 に答える