我有一个如下所示的 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 元素的封面不被排除,而第三个 Cover 元素的封面被排除。第二个封面元素没有 AdditionalCover,因此没有引用它的 AdditionalCoverResult 元素。
我的问题是,在一个<xsl:for-each select="//Cover">
循环中,我想不出一种方法来识别我应该寻找哪个 AdditionalCoverResult 元素。在 for-each 中使用position()
最终会导致我错误地为没有 AdditionalCover 的 Cover 元素输出 AdditionalCoverResult 信息。
我必须保留 Cover 的原始顺序,所以我不能做两个单独的循环,一个用于带有 AdditionalCover 的 Cover,一个用于不带 AdditionalCover 的 Cover。
在返回的节点集中,//Cover
有没有一种方法可以识别上下文节点在返回的节点集中的位置//Cover[AdditionalCover]
?
我有点猜测,对于 Cover 元素,我需要考虑“我在什么索引中,//Cover[AdditionalCover]
以便我可以使用该索引来识别我相应的 AdditionalCoverResult 元素?”