0

1以前に発生したノードに追加しようとしています。その背後にあるロジックは、前のノードが指定された3つのフィールドで一致しない場合です。次に、位置をに設定し1ます。前のノードが前のノードと一致する場合は、前の位置から値を取得して、を追加し1ます。

1これを完了するためにXSLTを作成しましたが、前のノードに追加する方法がわかりません。

コードのスニペットを使用する場合:

<xsl:value-of select="preceding-sibling::orderLine/position + '1'"/>

出力で得られる応答は次のとおりです。

<position>NaN</position>

私が使用しているXSLTは次のとおりです。

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

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

    <xsl:template
        match="/order/orderLines/orderLine[sku = preceding-sibling::orderLine/sku and lineId = preceding-sibling::orderLine/lineId]"/>

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


                <xsl:choose>

                    <xsl:when
                        test="lineId = preceding-sibling::orderLine/lineId and sku = preceding-sibling::orderLine/sku and lineTrackingUrl = preceding-sibling::orderLine/lineTrackingUrl">
                        <position>
                            <!-- THE ISSUE IS HERE -->
                            <xsl:value-of select="preceding-sibling::orderLine/position + '1'"/>
                            <!-- THE ISSUE IS HERE -->
                        </position>
                    </xsl:when>
                    <xsl:otherwise>
                        <position>1</position>
                    </xsl:otherwise>
                </xsl:choose>

            </xsl:copy>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

入力例:

    <?xml version="1.0" encoding="utf-8"?>
<order>
    <orderLines>
        <orderLine>
            <lineId>4</lineId>
            <sku>1111111</sku>
            <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        </orderLine>
        <orderLine>
            <lineId>4</lineId>
            <sku>1111111</sku>
            <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        </orderLine>
        <orderLine>
            <lineId>4</lineId>
            <sku>1111111</sku>
            <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        </orderLine>
        <orderLine>
            <lineId>4</lineId>
            <sku>1111111</sku>
            <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        </orderLine>
        <orderLine>
            <lineId>3</lineId>
            <sku>1111111</sku>
            <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        </orderLine>
        <orderLine>
            <lineId>3</lineId>
            <sku>1111111</sku>
            <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        </orderLine>
        <orderLine>
            <lineId>3</lineId>
            <sku>1111111</sku>
            <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        </orderLine>
        <orderLine>
            <lineId>3</lineId>
            <sku>1111111</sku>
            <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        </orderLine>
    </orderLines>
</order>

上記の入力例を使用すると、これが機能しない理由が完全にわかります。

期待される結果:

<?xml version="1.0" encoding="utf-8"?>
<order>
    <orderLine>
        <lineId>4</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>0</position>
    </orderLine>
    <orderLine>
        <lineId>4</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>1</position>
    </orderLine>
    <orderLine>
        <lineId>4</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>2</position>
    </orderLine>
    <orderLine>
        <lineId>4</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>3</position>
    </orderLine>
    <orderLine>
        <lineId>3</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>0</position>
    </orderLine>
    <orderLine>
        <lineId>3</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>1</position>
    </orderLine>
    <orderLine>
        <lineId>3</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>2</position>
    </orderLine>
    <orderLine>
        <lineId>3</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>3</position>
    </orderLine>
</order>

実際の結果:

<?xml version="1.0" encoding="utf-8"?>
<order>
    <orderLine>
        <lineId>4</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>0</position>
    </orderLine>
    <orderLine>
        <lineId>4</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>1</position>
    </orderLine>
    <orderLine>
        <lineId>4</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>2</position>
    </orderLine>
    <orderLine>
        <lineId>4</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>3</position>
    </orderLine>
    <orderLine>
        <lineId>3</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>0</position>
    </orderLine>
    <orderLine>
        <lineId>3</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>5</position>
    </orderLine>
    <orderLine>
        <lineId>3</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>6</position>
    </orderLine>
    <orderLine>
        <lineId>3</lineId>
        <sku>1111111</sku>
        <lineTrackingUrl>![CDATA[1111111111]]</lineTrackingUrl>
        <position>7</position>
    </orderLine>
</order>

これが機能しない理由は、前のノードと一致しているためです。

これはコードです:

<xsl:when
    test="lineId = preceding-sibling::orderLine/lineId and sku = preceding-sibling::orderLine/sku and lineTrackingUrl = preceding-sibling::orderLine/lineTrackingUrl">
    <position>
        <xsl:value-of select="count(preceding-sibling::orderLine/lineId)"/>
    </position>
</xsl:when>

いつtestの場合lineId = preceding-sibling::orderLine/lineId and sku = preceding-sibling::orderLine/sku and lineTrackingUrl = preceding-sibling::orderLine/lineTrackingUrlでも実際のカウントの場合はpreceding-sibling::orderLine/lineId

したがって、前のものと同じlineId、同じSku、同じTrackingUrlを持つものだけでなく、すべてのlineIdと一致するだけでなく、その前のものも...などです。これを制限するにはどうすればよいですか?

改訂版

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

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

    <xsl:template
        match="/order/orderLines/orderLine[sku = preceding-sibling::orderLine/sku and lineId = preceding-sibling::orderLine/lineId]"/>

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

                <xsl:choose>

                    <xsl:when
                        test="lineId = preceding-sibling::orderLine[4]/lineId and sku = preceding-sibling::orderLine[4]/sku">
                        <position>
                            <xsl:value-of select="'5'"/>
                        </position>
                    </xsl:when>
                    <xsl:when
                        test="lineId = preceding-sibling::orderLine[3]/lineId and sku = preceding-sibling::orderLine[3]/sku">
                        <position>
                            <xsl:value-of select="'4'"/>
                        </position>
                    </xsl:when>
                    <xsl:when
                        test="lineId = preceding-sibling::orderLine[2]/lineId and sku = preceding-sibling::orderLine[2]/sku">
                        <position>
                            <xsl:value-of select="'3'"/>
                        </position>
                    </xsl:when>
                    <xsl:when
                        test="lineId = preceding-sibling::orderLine[1]/lineId and sku = preceding-sibling::orderLine[1]/sku">
                        <position>
                            <xsl:value-of select="'2'"/>
                        </position>
                    </xsl:when>
                    <xsl:otherwise>
                        <position><xsl:value-of select="'1'"/></position>

                    </xsl:otherwise>
                </xsl:choose>

            </xsl:copy>
        </xsl:for-each>
        </orderLines>
    </xsl:template>
</xsl:stylesheet>

複数のwhenステートメントを実行するためのより適切な方法はありますか?これは4つのアイテムに対してのみ機能しますが、無制限のアイテムに対して実行する方法はありますか?現時点ではこれで問題ありませんが、拡張が必要な​​場合はどうすればよいですか?

4

1 に答える 1

0

count()関数を使用して問題を解決したので、問題の行は次のようになります。

<xsl:value-of select="count(preceding-sibling::orderLine/lineId)"/>

これにより、正しい番号が自動的にに入力されます<position/>

したがって、これはXSLT全体が次のようになることを意味します。

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

    <xsl:variable name="start" select="'0'"/>

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

    <xsl:template
        match="/order/orderLines/orderLine[sku = preceding-sibling::orderLine/sku and lineId = preceding-sibling::orderLine/lineId]"/>

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


                <xsl:choose>

                    <xsl:when
                        test="lineId = preceding-sibling::orderLine/lineId and sku = preceding-sibling::orderLine/sku and lineTrackingUrl = preceding-sibling::orderLine/lineTrackingUrl">
                        <position>
                            <xsl:value-of select="count(preceding-sibling::orderLine/lineId)"/>
                        </position>
                    </xsl:when>
                    <xsl:otherwise>
                        <position>1</position>
                    </xsl:otherwise>
                </xsl:choose>

            </xsl:copy>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
于 2012-08-15T10:16:00.857 に答える