2012-10-11 47 views
1

我有一些文章行可能會或可能沒有訂單號。如果該行未輸入訂單號,我想將最新的現有訂單號顯示爲此訂單號。XSLT和重新使用裏面的值每個

<?xml version="1.0" encoding="utf-8"?> 
<Invoice> 
<InvoiceNumber>123</InvoiceNumber> 
<OrderNumber>head1</OrderNumber> 
<Rows> 
<Row> 
<ArticleNumer>1</ArticleNumer> 
<OrderNumber>line1</OrderNumber> 
<Quantity>1</Quantity> 
<Price>10</Price> 
</Row> 
<Row> 
<ArticleNumer>2</ArticleNumer> 
<OrderNumber><!--Here i want line1--></OrderNumber> 
<Quantity>1</Quantity> 
<Price>10</Price> 
</Row> 
<Row> 
<ArticleNumer>3</ArticleNumer> 
<OrderNumber><!--Here i want line1--></OrderNumber> 
<Quantity>1</Quantity> 
<Price>10</Price> 
</Row> 

<Row> 
<ArticleNumer>4</ArticleNumer> 
<OrderNumber>line2</OrderNumber> 
<Quantity>1</Quantity> 
<Price>10</Price> 
</Row> 
<Row> 
<ArticleNumer>4</ArticleNumer> 
<OrderNumber><!--Here i want line2--></OrderNumber> 
<Quantity>1</Quantity> 
<Price>10</Price> 
</Row> 
</Rows> 
</Invoice> 

我在行上使用for-each,這似乎使整個事情變得複雜一點。 通過使用前兄弟我可以得到最新的現有值,如果第二行是空的。但如果第三和第四行缺少訂單號碼,我怎麼能得到它?

在if-statment中創建變量不起作用。 在for-each中使用模板會給我一個錯誤信息。 我也想過使用一個計數器,爲每個空的訂單號碼行添加1,並使用前兄弟姐妹,但不能真正看到我面前的解決方案。

任何想法?

最好的問候, 安德烈亞斯

下面是更多的,我使用完全相同的代碼:

現在它會是更加混亂了一下呢。特別是當我非常不熟悉XSLT時。 Best_nr2是我的示例中的Ordernumber。但是:

<xsl:for-each select="Invoice/Tables/Table/TableRow"> 

<xsl:if test="string-length(Field [@Type='best_nr2']/text())&lt;2 and 
            string-length(preceding-sibling::TableRow/Field [@Type='best_nr2']/text())&lt;2 "> 
           <secondaryorder_number> 
            <xsl:value-of select="$dispatchOrderNr"/> 
           </secondaryorder_number> 
           </xsl:if> 

           <xsl:if test="string-length(Field [@Type='best_nr2']/text())&gt;2"> 
           <secondaryorder_number> 
            <xsl:value-of select="Field [@Type='best_nr2']/text()"/> 
           </secondaryorder_number> 

           </xsl:if> 



           <xsl:if test="string-length(Field [@Type='best_nr2']/text())&lt;2 and 
           string-length(preceding-sibling::TableRow/Field [@Type='best_nr2']/text())&gt;2 and 
           preceding-sibling::TableRow[1]/Field [@Type='best_nr2']/text()&gt;2 "> 
           <secondaryorder_number> 
            <xsl:value-of select="preceding-sibling::TableRow[1]/Field [@Type='best_nr2']/text()"/> 
           </secondaryorder_number> 
           </xsl:if> 


           <xsl:if test="string-length(Field [@Type='best_nr2']/text())&lt;2 and 
           string-length(preceding-sibling::TableRow[1]/Field [@Type='best_nr2']/text())&lt;2 
           and string-length(preceding-sibling::TableRow/Field[@Type='best_nr2']/text())&gt;2"> 
           <secondaryorder_number> 

           </secondaryorder_number> 
           </xsl:if> 
           <lit_quantity> 
            <xsl:value-of select="translate(Field [@Type='lit_deliveredquantity'], ' ,',' .')"/> 
           </lit_quantity> 
          </LineItem> 
          <xsl:variable name="dispatchbestnr2" select="Field [@Type='best_nr2']/text()"/> 
         </xsl:for-each> 
        </LineItems> 
       </Dispatchnote> 
      </xsl:for-each 

回答

1

這裏有一個例子:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

<xsl:template match="Row/OrderNumber[not(text())]"> 
    <xsl:copy> 
    <xsl:value-of select="../preceding-sibling::Row[OrderNumber/text()][1]/OrderNumber"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

第一個模板是身份模板,通過電平拷貝節點的水平,有機會重寫它要處理的節點,而在沒有任何文本內容的OrderNumber元素的第二個模板中完成。

+0

那麼樣式表是一個完整的樣本來處理您的輸入樣本。當然,模板不屬於「for-each」。如果您需要幫助將我的建議集成到您的代碼中,那麼我們需要查看您的代碼(儘管如果它是一個包含大量嵌套對象的模板,那麼恐怕將這兩種方法結合起來很困難)。 –

+0

第一篇文章編輯。 – Dreas89

+0

如果我只有一種方法來保存最新的現有訂單號/ best_nr2,然後打印它,所有這些都是非常好的。 – Dreas89