0

ここで XSLT ロジックを取得するのを手伝ってください。出力のコメントとして要件を説明しました。以下が出力と入力であることを確認してください。

入力:

    <OutputParameters>

  <OUT_SHIPMENT_TBL>
    <OUT_SHIPMENT_TBL_ITEM>
    <SLevel1>1</SLevel1>
    <SLevel1>S</SLevel1>
      <DELIVERY_ID>2334356776</DELIVERY_ID>
      <ORDER_SHIP_CODE_EXT>3467</ORDER_SHIP_CODE_EXT>
      <CUSTOMER_NUMBER>4838</CUSTOMER_NUMBER>
      <OEH_POSTAL_CODE  xsi:nil="true"/>
      <OEH_COUNTRY  xsi:nil="true"/>

      <ORDER_TBL_TYPE>
        <ORDER_TBL_TYPE_ITEM>
        <OLevel1>2333</OLevel1>
        <OLevel2>344</OLevel2>
        <OLevel3>O</OLevel3>
          <PURCHASE_ORDER_NUMBER>95678</PURCHASE_ORDER_NUMBER>
          <TOTAL_ORDER_GROSSWEIGHT>345</TOTAL_ORDER_GROSSWEIGHT>
          <TOTAL_ORDER_SHIPQTY>32</TOTAL_ORDER_SHIPQTY>

          <ORDER_LINES_TBL_TYPE>
            <ORDER_LINES_TBL_TYPE_ITEM>
              <!-- unbounded -->

              <ILevel1>2333</ILevel1>
              <ILevel2>2333</ILevel2>
              <ILevel3>2333</ILevel3>
              <PALLET_NUMBER>4546</PALLET_NUMBER>
              <CARTON_NUMBER>344235</CARTON_NUMBER>
              <WEB_TRANSACTION_ID>346788</WEB_TRANSACTION_ID>
              <FREIGHT_TERMS_CODE_INT>243546</FREIGHT_TERMS_CODE_INT>
              <VENDOR_NUM>344677</VENDOR_NUM>
              <ITEM>50116</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>

            <ORDER_LINES_TBL_TYPE_ITEM>
            <ILevel1>2333</ILevel1>
              <ILevel2>2333</ILevel2>
              <ILevel3>2333</ILevel3>
              <PALLET_NUMBER>4546</PALLET_NUMBER>
              <CARTON_NUMBER>344235</CARTON_NUMBER>
              <WEB_TRANSACTION_ID>346788</WEB_TRANSACTION_ID>
              <FREIGHT_TERMS_CODE_INT>243546</FREIGHT_TERMS_CODE_INT>
              <VENDOR_NUM>344677</VENDOR_NUM>
              <ITEM>50116</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>





          </ORDER_LINES_TBL_TYPE>
        </ORDER_TBL_TYPE_ITEM>

        <!-- 2 nd Order -->

      </ORDER_TBL_TYPE>
    </OUT_SHIPMENT_TBL_ITEM>
  </OUT_SHIPMENT_TBL>
</OutputParameters>

1)複数あり<ORDER_TBL_TYPE_ITEM>ます。

2)内部に<ORDER_TBL_TYPE_ITEM>複数<ORDER_LINES_TBL_TYPE_ITEM>存在。

3) 反復ごとに、以下に示す要素に割り当てられた一連の番号が必要です。前 = 現在の場合、level1、2、3 要素を無視して ITEM 値を直接渡す場合も条件があります。

出力:

    <OutputParameters>

  <OUT_SHIPMENT_TBL>
    <OUT_SHIPMENT_TBL_ITEM>
    <SLevel1>1</SLevel1>
    <SLevel1>S</SLevel1>
      <DELIVERY_ID>3335</DELIVERY_ID>
      <ORDER_SHIP_CODE_EXT>445</ORDER_SHIP_CODE_EXT>
      <CUSTOMER_NUMBER>4838</CUSTOMER_NUMBER>
      <OEH_POSTAL_CODE  xsi:nil="true"/>
      <OEH_COUNTRY  xsi:nil="true"/>

      <ORDER_TBL_TYPE>
        <ORDER_TBL_TYPE_ITEM>
          <!-- unbounded -->
          <OLevel1>2</OLevel1>
        <OLevel2>1</OLevel2>
        <OLevel3>O</OLevel3>
          <PURCHASE_ORDER_NUMBER>44342</PURCHASE_ORDER_NUMBER>
          <!-- assign sequnce number starts from 2 -->
          <DELIVERY_ID>133232</DELIVERY_ID>
          <!-- hard code value as 1 -->
          <TOTAL_ORDER_GROSSWEIGHT>42323C</TOTAL_ORDER_GROSSWEIGHT>
          <!-- hard code value as C -->
          <TOTAL_ORDER_SHIPQTY>32</TOTAL_ORDER_SHIPQTY>

          <ORDER_LINES_TBL_TYPE>

              <!-- unbounded -->



            <!-- The UniqueID is the temporary variable.PALLET_NUMBER is coming from input.

if PALLET_NUMBER!=NULL then

UniqueID=substring (PALLET_NUMBER, 10)

if PALLET_NUMBER =NULL then

UniqueID=substring (CARTON_NUMBER, 7) -->

<!-- Condition here If previous UniqueID != current UniqueID  and PALLET_NUMBER!=NULL  then-->IF TRUE
<ORDER_LINES_TBL_TYPE_ITEM>

              <ILevel1>3</ILevel1>
               <!-- assign sequnce number starts from 3 -->
              <ILevel2>2</ILevel2>
               <!-- assign sequnce number of <Olevel1> -->
              <ILevel3>T</ILevel3>
              <!-- hard code value as T-->
              <PALLET_NUMBER>45463456788899432445</PALLET_NUMBER>
              <CARTON_NUMBER>344235</CARTON_NUMBER>
              <WEB_TRANSACTION_ID>3y4</WEB_TRANSACTION_ID>

              <FREIGHT_TERMS_CODE_INT>442</FREIGHT_TERMS_CODE_INT>

              <VENDOR_NUM>C4466I</VENDOR_NUM>

              <ITEM>50116</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>

            <!-- Condition here If previous UniqueID != current UniqueID  and PALLET_NUMBER =NULL  then-->iF TRUE
            <ORDER_LINES_TBL_TYPE_ITEM>
            <ILevel1>4</ILevel1>
               <!-- assign sequnce number increment -->
              <ILevel2>2</ILevel2>
               <!-- assign sequnce number of <Olevel1> -->
              <ILevel3>P</ILevel3>
              <!-- hard code value as T-->
              <PALLET_NUMBER></PALLET_NUMBER>
              <CARTON_NUMBER>344235</CARTON_NUMBER>
              <WEB_TRANSACTION_ID>3y4</WEB_TRANSACTION_ID>

              <FREIGHT_TERMS_CODE_INT>442</FREIGHT_TERMS_CODE_INT>

              <VENDOR_NUM>C4466I</VENDOR_NUM>

              <ITEM>50116</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>



            <ORDER_LINES_TBL_TYPE_ITEM>
            <ILevel1>5</ILevel1>
               <!-- assign sequnce number increment -->
              <ILevel2>4</ILevel2>
               <!-- if T Level is true then <ILevel2> of T level 
               if P Level is true then <ILevel2> of P level 
               -->
              <ILevel3>I</ILevel3>
              <!-- hard code value as I-->
              <PALLET_NUMBER></PALLET_NUMBER>
              <CARTON_NUMBER>344235</CARTON_NUMBER>
              <WEB_TRANSACTION_ID>3y4</WEB_TRANSACTION_ID>

              <FREIGHT_TERMS_CODE_INT>442</FREIGHT_TERMS_CODE_INT>

              <VENDOR_NUM>C4466I</VENDOR_NUM>

              <ITEM>50116</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>



<!-- Condition here If previous UniqueID != current UniqueID  and PALLET_NUMBER!=NULL  then-->IF FALSE

            < NO LOOP HERE FOR T LEVEL>



            <!-- Condition here If previous UniqueID != current UniqueID  and PALLET_NUMBER =NULL  then-->iF TRUE
            <ORDER_LINES_TBL_TYPE_ITEM>
            <ILevel1>6</ILevel1>
              <ILevel2>2</ILevel2>
              <ILevel3>P</ILevel3>
              <WEB_TRANSACTION_ID>685858</WEB_TRANSACTION_ID>
              <FREIGHT_TERMS_CODE_INT>87899</FREIGHT_TERMS_CODE_INT>
              <VENDOR_NUM>457482</VENDOR_NUM>
              <ITEM>50119</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>


            <ORDER_LINES_TBL_TYPE_ITEM>
            <ILevel1>7</ILevel1>
              <ILevel2>6</ILevel2>
              <ILevel3>I</ILevel3>
              <WEB_TRANSACTION_ID>685858</WEB_TRANSACTION_ID>
              <FREIGHT_TERMS_CODE_INT>87899</FREIGHT_TERMS_CODE_INT>
              <VENDOR_NUM>457482</VENDOR_NUM>
              <ITEM>50119</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>

</ORDER_LINES_TBL_TYPE>

        </ORDER_TBL_TYPE_ITEM>

        <!-- 2 nd Order -->


      </ORDER_TBL_TYPE>
    </OUT_SHIPMENT_TBL_ITEM>
  </OUT_SHIPMENT_TB

L>

4

2 に答える 2

0

探している条件付きロジックは次のようなものです。<colorItems>ここでは、コンテキストノードが要素であると想定しています。

<xsl:if test="color != preceding-sibling::colorItems[1]/color">
    ... process Level1, 2, 3 ...
</xsl:if>
<xsl:copy-of select="color" />
于 2013-03-18T13:34:39.900 に答える
0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*" />

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

  <xsl:template match="OUT_SHIPMENT_TBL_ITEM | 
                       ORDER_TBL_TYPE_ITEM[1] | 
                       ORDER_LINES_TBL_TYPE_ITEM[1]">
    <xsl:param name="currentSequenceNo" select="0" />

    <xsl:apply-templates select="." mode="iterate">
      <xsl:with-param name="currentSequenceNo" select="$currentSequenceNo" />
      <xsl:with-param name="parentSequenceNo" select="$currentSequenceNo" />
    </xsl:apply-templates>
  </xsl:template>
  <xsl:template match="ORDER_TBL_TYPE_ITEM | ORDER_LINES_TBL_TYPE_ITEM" />

  <xsl:template match="*" mode="iterate">
    <xsl:param name="currentSequenceNo" />
    <xsl:param name="parentSequenceNo" />

    <xsl:variable name="differentFromPreviousStr">
      <xsl:apply-templates select="." mode="different" />
    </xsl:variable>
    <xsl:variable name="differentFromPrevious"
                  select="$differentFromPreviousStr = 'true'" />
    <xsl:variable name="thisSequenceNo"
                  select="$currentSequenceNo + $differentFromPrevious" />
    <xsl:copy>
      <xsl:apply-templates select="*[$differentFromPrevious or position() &gt; 3]">
        <xsl:with-param name="currentSequenceNo" select="$thisSequenceNo" />
        <xsl:with-param name="parentSequenceNo" select="$parentSequenceNo" />
        <xsl:with-param name="code">
          <xsl:apply-templates select="." mode="code" />
        </xsl:with-param>
      </xsl:apply-templates>
    </xsl:copy>

    <xsl:variable name="childSequenceCount">
      <xsl:apply-templates select="." mode="childSequence" />
    </xsl:variable>

    <xsl:apply-templates select="following-sibling::*[1]
                                     [name() = name(current())]"
                         mode="iterate">
      <xsl:with-param name="currentSequenceNo"
                      select="$thisSequenceNo + $childSequenceCount" />
      <xsl:with-param name="parentSequenceNo" select="$parentSequenceNo" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="*" mode="different">
    <xsl:text>true</xsl:text>
  </xsl:template>
  <xsl:template match="ORDER_LINES_TBL_TYPE_ITEM" mode="different">
    <xsl:value-of
         select="not(ITEM = preceding-sibling::ORDER_LINES_TBL_TYPE_ITEM[1]/ITEM)" />
  </xsl:template>

  <xsl:template match="*" mode="childSequence">
    <xsl:text>0</xsl:text>
  </xsl:template>
  <xsl:template match="ORDER_TBL_TYPE_ITEM" mode="childSequence">
    <xsl:value-of
       select="count(ORDER_LINES_TBL_TYPE/ORDER_LINES_TBL_TYPE_ITEM[not(
                              ITEM = 
                               preceding-sibling::ORDER_LINES_TBL_TYPE_ITEM[1]/ITEM
                                            )])" />
  </xsl:template>

  <xsl:template match="OUT_SHIPMENT_TBL_ITEM" mode="code">
    <xsl:text>E</xsl:text>
  </xsl:template>
  <xsl:template match="ORDER_TBL_TYPE_ITEM" mode="code">
    <xsl:text>C</xsl:text>
  </xsl:template>
  <xsl:template match="ORDER_LINES_TBL_TYPE_ITEM" mode="code">
    <xsl:text>CI</xsl:text>
  </xsl:template>

  <xsl:template match="OUT_SHIPMENT_TBL | ORDER_TBL_TYPE | ORDER_LINES_TBL_TYPE">
    <xsl:param name="currentSequenceNo" select="0" />
    <xsl:param name="parentSequenceNo" />

    <xsl:copy>
      <xsl:apply-templates>
        <xsl:with-param name ="currentSequenceNo" select="$currentSequenceNo" />
        <xsl:with-param name="parentSequenceNo" select="$parentSequenceNo" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="node()[self::OUT_SHIPMENT_TBL_ITEM or 
                              self::ORDER_TBL_TYPE_ITEM or
                              self::ORDER_LINES_TBL_TYPE_ITEM]/*[1]">
    <xsl:param name="currentSequenceNo" />
    <xsl:copy>
      <xsl:value-of select="$currentSequenceNo"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="node()[self::ORDER_TBL_TYPE_ITEM or
                              self::ORDER_LINES_TBL_TYPE_ITEM]/*[2]">
    <xsl:param name="parentSequenceNo" />
    <xsl:copy>
      <xsl:value-of select="$parentSequenceNo" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="OUT_SHIPMENT_TBL_ITEM/*[2] | 
                       node()[self::ORDER_TBL_TYPE_ITEM or
                              self::ORDER_LINES_TBL_TYPE_ITEM]/*[3]">
    <xsl:param name="code" />
    <xsl:copy>
      <xsl:value-of select="$code" />
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、次が生成されます。

<OutputParameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <OUT_SHIPMENT_TBL>
    <OUT_SHIPMENT_TBL_ITEM>
      <DELIVERY_ID>1</DELIVERY_ID>
      <ORDER_SHIP_CODE_EXT>E</ORDER_SHIP_CODE_EXT>
      <CUSTOMER_NUMBER>4838</CUSTOMER_NUMBER>
      <OEH_POSTAL_CODE xsi:nil="true" />
      <OEH_COUNTRY xsi:nil="true" />
      <ORDER_TBL_TYPE>
        <ORDER_TBL_TYPE_ITEM>
          <PURCHASE_ORDER_NUMBER>2</PURCHASE_ORDER_NUMBER>
          <TOTAL_ORDER_GROSSWEIGHT>1</TOTAL_ORDER_GROSSWEIGHT>
          <TOTAL_ORDER_SHIPQTY>C</TOTAL_ORDER_SHIPQTY>
          <ORDER_LINES_TBL_TYPE>
            <ORDER_LINES_TBL_TYPE_ITEM>
              <WEB_TRANSACTION_ID>3</WEB_TRANSACTION_ID>
              <FREIGHT_TERMS_CODE_INT>2</FREIGHT_TERMS_CODE_INT>
              <VENDOR_NUM>CI</VENDOR_NUM>
              <ITEM>50116</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>
            <ORDER_LINES_TBL_TYPE_ITEM>
              <ITEM>50116</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>
            <ORDER_LINES_TBL_TYPE_ITEM>
              <WEB_TRANSACTION_ID>4</WEB_TRANSACTION_ID>
              <FREIGHT_TERMS_CODE_INT>2</FREIGHT_TERMS_CODE_INT>
              <VENDOR_NUM>CI</VENDOR_NUM>
              <ITEM>6435</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>
          </ORDER_LINES_TBL_TYPE>
        </ORDER_TBL_TYPE_ITEM>
        <ORDER_TBL_TYPE_ITEM>
          <PURCHASE_ORDER_NUMBER>5</PURCHASE_ORDER_NUMBER>
          <DELIVERY_ID>1</DELIVERY_ID>
          <TOTAL_ORDER_GROSSWEIGHT>C</TOTAL_ORDER_GROSSWEIGHT>
          <TOTAL_ORDER_SHIPQTY>32</TOTAL_ORDER_SHIPQTY>
          <ORDER_LINES_TBL_TYPE>
            <ORDER_LINES_TBL_TYPE_ITEM>
              <WEB_TRANSACTION_ID>6</WEB_TRANSACTION_ID>
              <FREIGHT_TERMS_CODE_INT>5</FREIGHT_TERMS_CODE_INT>
              <VENDOR_NUM>CI</VENDOR_NUM>
              <ITEM>50119</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>
            <ORDER_LINES_TBL_TYPE_ITEM>
              <WEB_TRANSACTION_ID>7</WEB_TRANSACTION_ID>
              <FREIGHT_TERMS_CODE_INT>5</FREIGHT_TERMS_CODE_INT>
              <VENDOR_NUM>CI</VENDOR_NUM>
              <ITEM>87554</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>
            <ORDER_LINES_TBL_TYPE_ITEM>
              <ITEM>87554</ITEM>
              <CROSS_REFERENCE_UPC>034138102008</CROSS_REFERENCE_UPC>
            </ORDER_LINES_TBL_TYPE_ITEM>
          </ORDER_LINES_TBL_TYPE>
        </ORDER_TBL_TYPE_ITEM>
        <!-- 2 nd Order -->
      </ORDER_TBL_TYPE>
    </OUT_SHIPMENT_TBL_ITEM>
  </OUT_SHIPMENT_TBL>
</OutputParameters>
于 2013-03-18T14:37:23.500 に答える