2013-03-14 42 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每個訂單和項目,我們需要分配一個增量值。如果之前的項目值等於當前項目值。不需要增加傳遞值。其他增量值分配給項目元素。 我需要的輸出如下所示。

<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 2013-03-14 19:58:04

+0

您能否爲您的問題添加一些具體的細節,具體說明您嘗試過的內容(使用代碼片段)以及您遇到的問題?例如,你得到的輸出是你想要得到的嗎? – toxotes 2013-03-14 20:01:01

+0

爲什麼輸入中的值與數字相關_replaced_而不是將數字添加到某處(如在屬性中)?是否需要實際值? – JLRishe 2013-03-14 20:14:14

回答

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>