このコードが最もクリーンではないことはわかっていますが、残念ながら適切にリファクタリングすることはできません。
position()
問題は、2 回目の繰り返しで真の値が返されることを期待することです。しかし、position()
それを使用すると、2回目の反復で期待されるように、決してtrueを返しません。
しかし、選択値をハードコーディングすると、期待される結果が返されます。次に例を示します。
<root>
<MainProducts>
<MainProduct>
<Published>0</Published>
</MainProduct>
<MainProduct>
<Published>1</Published>
</MainProduct>
</MainProducts>
<SubProducts>
<SubProduct>
<IsDefault>1</IsDefault>
</SubProduct>
<SubProduct>
<IsDefault>0</IsDefault>
</SubProduct>
</SubProducts>
</root>
XML コンテンツ:
<xsl:for-each select="/root/SubProducts/SubProduct">
<script type="text/javascript">
// Always returns false
console.log("Dynamic position " + <xsl:value-of select="position()" /> + " IsDefault: " + ( <xsl:value-of select="/root/MainProducts/MainProduct[position()]/Published" /> == 1 ? "true" : "false" ));
</script>
</xsl:for-each>
<script type="text/javascript">
// Returns false, but expected to return true on second iteration.
console.log("Hard coded position 1 IsDefault: " + ( <xsl:value-of select="/root/MainProducts/MainProduct[1]/Published" /> == 1 ? "true" : "false" ));
// Returns true
console.log("Hard coded position 2 IsDefault: " + ( <xsl:value-of select="/root/MainProducts/MainProduct[2]/Published" /> == 1 ? "true" : "false" ));
</script>
正確なコンソール出力は次のとおりです。
Dynamic position 1 IsDefault: false
Dynamic position 2 IsDefault: false
Hard coded position 1 IsDefault: false
Hard coded position 2 IsDefault: true
position()
ノードを適切に選択していないために、ここで何が欠けていますか?