2013-03-15 3 views
0

В Отряде присутствует количество заказов. Для каждого заказа есть ряд элементов позиции заказа. Элементы позиции заказа содержат элемент. Для каждой итерации мы поддерживаем уровни иерархии. В разделе OrderLine Items, если предыдущий элемент равен текущему элементу, нет необходимости увеличивать иерархию.Как мы можем выполнить Условный приращение в xslt

точки:

  1. Там только одна отгрузки
  2. Количество заказов присутствуют в отгрузке.
  3. номер заказаLineItems за каждый заказ.
  4. для каждой итерации заказов и orderlineItems мы должны поддерживать уровни иерархии (значение приращения), но когда приходит в 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> 

+0

Не могли бы вы cla уточните свой вопрос и используйте более мелкие примеры. Может быть, даже создать минимальный пример того, чего вы хотите достичь? – chris

+0

Из ввода мы получаем данные о доставке. Количество заказов на каждый заказ. Каждый заказ имеет несколько orderLineItems.The Order и OrderLineitems должны итерации. Для каждой итерации мы должны поддерживать уровни иерархии, но здесь одно условие есть, если предыдущее значение элемента равно текущему значению элемента, не нужно увеличивать значение уровня иерархии. В противном случае нам нужно увеличивать иерархию порядка и orderlineItems зависит от того, сколько раз оно повторяется. – sum

+0

Почему элементы «Level3» установлены как «O» или «I»? –

ответ

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> 
+0

Я добавил вход xml, можно указать переменную счетчика для этой структуры. – sum