1

注文番号がある場合とない場合がある記事の行がいくつかあります。行に注文番号がない場合は、この記事の注文番号として最新の既存の注文番号を表示します。

<?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を使用していますが、これは全体を少し複雑にしているようです。先行兄弟を使用することにより、2行目が空の場合に最新の既存の値を取得できます。しかし、3行目と4行目に注文番号がない場合、どうすれば入手できますか?

ifステートメント内に変数を作成しても機能しません。for-each内でテンプレートを使用すると、エラーメッセージが表示されます。また、空の注文番号ごとに1を追加するカウンターを使用し、先行する兄弟を使用することも考えていましたが、目の前でその解決策を実際に見ることはできません。

何か案は?

よろしく、アンドレアス

これが私が使用する正確なコードの詳細です:

さて、それはもう少し混乱するでしょう。特に、XSLTにあまり慣れていない場合。Best_nr2は、私のサンプルの注文番号です。だが:

<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
4

1 に答える 1

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>

最初のテンプレートは、ノードをレベルごとにコピーするIDテンプレートであり、操作するノードに対してそれをオーバーライドする機会があります。これOrderNumberは、テキストコンテンツを含まない要素に対して2番目のテンプレートで実行されます。

于 2012-10-11T14:12:40.073 に答える