【发布时间】:2012-05-25 09:58:27
【问题描述】:
我有一个如下所示的 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 的原始顺序,所以我不能做两个单独的循环,一个用于 Cover with AdditionalCover,一个用于 Cover without AdditionalCover。
在//Cover 返回的节点集中,有没有办法可以识别上下文节点在//Cover[AdditionalCover] 返回的节点集中的位置?
我有点猜测,对于 Cover 元素,我需要考虑“我在 //Cover[AdditionalCover] 中的索引是什么,以便我可以使用该索引来识别我对应的 AdditionalCoverResult 元素?”
【问题讨论】: