2013-03-14 5 views
1

ввод:Как мы можем достичь Условного прироста XSLT

<Order> 
    <HeaderValue1>ORDER1</HeaderValue1> 
    <OrderLineItems> 
    <Item>`A`</Item> 
    </OrderLineitems> 
    <OrderLineItems> 
    <Item>A</Item> 
    </OrderLineItems> 
    <OrderLineItems> 
    <Item>`A`</Item>` 
    </OrderLineItems> 
    <OrderLineItems>` 
    <Item>B</Item>` 
    </OrderLineItems> 
</Order> 
<Order> 
    <HeaderValue1>`ORDER2`</HeaderValue1> 
    <OrderLineItems> 
    <Item>B`</Item> 
    </OrderLineItems> 
</Order> 

для каждого заказа существует ряд orderLineItems являются present.For каждого заказа и детали мы должны присвоить приращение value.if предыдущего значения элемента равна текущему значению элемента. Нет необходимости увеличивать значение, просто передайте значение. Другим значением приращения присваивается элемент элемента. Мне нужен выход, как показано ниже.

<Order> 
    <HeaderValue1>1`</HeaderValue1> 
    <OrderLineItems>` 
    <Item>2`</Item> 
    </OrderLineItems> 
    <OrderLineItems> 
    <Item>A`</Item> 
    </OrderLineItems> 
    <OrderLineItems> 
    <Item>A`</Item> 
    </OrderLineItems> 
    <OrderLineItems> 
    <Item>3`</Item> 
    </OrderLineItems> 
</Order> 
<Order> 
    <HeaderValue1>4</HeaderValue1> 
    <OrderLineItems> 
    <Item>5</Item> 
    </OrderLineItems> 
</Order> 
+0

Предоставленный выход кажется бессмысленным - даже с вашим описанием я не понимаю, как вы получаете от ввода к выходу. – ABach

+0

Не могли бы вы добавить некоторые детали к своему вопросу о том, что вы пробовали (с фрагментами кода), и с какими проблемами вы столкнулись? Например, это тот результат, который вы получаете или хотите получить? – toxotes

+0

Почему значения на входе были _replaced_ с числами, а не с добавленными числами (как в атрибуте)? Не нужны ли фактические значения? – JLRishe

ответ

0

Это преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:param name="pNum" select="0"/> 
    <xsl:copy> 
    <xsl:apply-templates select="node()[1]|@*"> 
    <xsl:with-param name="pNum" select="$pNum"/> 
    </xsl:apply-templates> 
    </xsl:copy> 
    <xsl:apply-templates select="following-sibling::node()[1]"> 
    <xsl:with-param name="pNum" select="$pNum"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="HeaderValue1"> 
    <xsl:param name="pNum" select="0"/> 

     <HeaderValue1><xsl:value-of select="$pNum+1"/></HeaderValue1> 

     <xsl:apply-templates select="following-sibling::node()[1]"> 
     <xsl:with-param name="pNum" select="$pNum+1"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="OrderLineItems[not(. = preceding-sibling::*[1])]"> 
    <xsl:param name="pNum" select="0"/> 

     <OrderLineItems> 
     <xsl:apply-templates select="node()[1]|@*"> 
     <xsl:with-param name="pNum" select="$pNum+1"/> 
     </xsl:apply-templates> 
     </OrderLineItems> 
     <xsl:apply-templates select="following-sibling::node()[1]"> 
     <xsl:with-param name="pNum" select="$pNum+1"/> 
     </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="Item[not(. = ../preceding-sibling::*[1])]"> 
    <xsl:param name="pNum" select="0"/> 

    <Item><xsl:value-of select="$pNum"/></Item> 
</xsl:template> 

<xsl:template match="Order"> 
    <xsl:param name="pNum" select="0"/> 

    <Order> 
    <xsl:apply-templates select="node()[1]|@*"> 
    <xsl:with-param name="pNum" select="$pNum"/> 
    </xsl:apply-templates> 
    <xsl:apply-templates select="following-sibling::node()[1]"> 
     <xsl:with-param name="pNum" select= 
     "$pNum +1 + count(OrderLineItems[not(. = preceding-sibling::*[1])])"/> 
    </xsl:apply-templates> 
    </Order> 

</xsl:template> 
</xsl:stylesheet> 

при нанесении на прилагаемом документе XML (с поправкой на быть хорошо сформированы):

<t> 
    <Order> 
     <HeaderValue1>ORDER1</HeaderValue1> 
     <OrderLineItems> 
      <Item>A</Item> 
     </OrderLineItems> 
     <OrderLineItems> 
      <Item>A</Item> 
     </OrderLineItems> 
     <OrderLineItems> 
      <Item>A</Item> 
     </OrderLineItems> 
     <OrderLineItems> 
      <Item>B</Item> 
     </OrderLineItems> 
    </Order> 
    <Order> 
     <HeaderValue1>ORDER2</HeaderValue1> 
     <OrderLineItems> 
      <Item>B</Item> 
     </OrderLineItems> 
    </Order> 
</t> 

производит нужное, правильное результат:

<t> 
    <Order> 
     <HeaderValue1>1</HeaderValue1> 
     <OrderLineItems> 
     <Item>2</Item> 
     </OrderLineItems> 
     <OrderLineItems> 
     <Item>A</Item> 
     </OrderLineItems> 
     <OrderLineItems> 
     <Item>A</Item> 
     </OrderLineItems> 
     <OrderLineItems> 
     <Item>3</Item> 
     </OrderLineItems> 
     <Order> 
     <HeaderValue1>4</HeaderValue1> 
     <OrderLineItems> 
      <Item>5</Item> 
     </OrderLineItems> 
     </Order> 
    </Order> 
</t> 
Смежные вопросы