次のような XML ドキュメントがあります。
<Root>
<Cover>
<Cover_Ref Val="1"/>
<Cover_Code Val="Food in transit"/>
<AdditionalCover>
<AdditionalCover_Area Val="Sussex"/>
</AdditionalCover>
</Cover>
<Cover>
<Cover_Ref Val="2"/>
<Cover_Code Val="Frozen goods"/>
</Cover>
<Cover>
<Cover_Ref Val="3"/>
<Cover_Code Val="Business equipment"/>
<AdditionalCover>
<AdditionalCover_Area Val="Sussex"/>
</AdditionalCover>
</Cover>
<AdditionalCoverResult>
<CoverArea Val="Sussex"/>
<CoverExcluded Val="N"/>
</AdditionalCoverResult>
<AdditionalCoverResult>
<CoverArea Val="Sussex"/>
<CoverExcluded Val="Y"/>
</AdditionalCoverResult>
</Root>
私はそれを次のようなものに変換する必要があります:
<Insurances>
<Insurance>
<reference>1</reference>
<CoverType>Food in transit</CoverType>
<Region>Sussex</Region>
<Excluded>N</Excluded>
</Insurance>
<Insurance>
<reference>2</reference>
<CoverType>Frozen goods</CoverType>
</Insurance>
<Insurance>
<reference>3</reference>
<CoverType>Business equipment</CoverType>
<Region>Sussex</Region>
<Excluded>Y</Excluded>
</Insurance>
</Insurances>
AdditionalCoverResult 要素は、AdditionalCover 要素を含む Cover 要素を参照します。つまり、最初の Cover 要素のカバーは除外されず、3 番目の Cover 要素のカバーは除外されます。2 番目の cover 要素には AdditionalCover がないため、それを参照する AdditionalCoverResult 要素はありません。
私の問題は、<xsl:for-each select="//Cover">
ループ内で、探しているAdditionalCoverResult要素を特定する方法を考えられないことです。for-each 内で使用position()
すると、AdditionalCover を持たない Cover 要素の AdditionalCoverResult 情報が誤って出力されてしまいます。
Cover の元の順序を保持する必要があるため、AdditionalCover を使用する Cover と AdditionalCover を使用しない Cover の 2 つの別々のループを実行することはできません。
によって返されたノードセット内で、によって返され//Cover
たノードセット内のコンテキストノードの位置を特定できる方法はあります//Cover[AdditionalCover]
か?
//Cover[AdditionalCover]
Cover 要素については、 「対応する AdditionalCoverResult 要素を識別するためにそのインデックスを使用できるようにするには、どのインデックス内にいるのか」と考える必要があると推測しています。