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つのアイテムに対してのみ機能しますが、無制限のアイテムに対して実行する方法はありますか?現時点ではこれで問題ありませんが、拡張が必要な場合はどうすればよいですか?