gpt4 book ai didi

xml - 确定上下文节点在另一个节点集中的位置

转载 作者:行者123 更新时间:2023-12-04 13:23:22 26 4
gpt4 key购买 nike

我有一个看起来像这样的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元素的封面不排除。第二个Cover元素没有AdditionalCover,因此没有引用它的AdditionalCoverResult元素。

我的问题是,在 <xsl:for-each select="//Cover">循环中,我想不出一种方法来识别我应该寻找的AdditionalCoverResult元素。在for-each中使用 position()最终导致我错误地输出了没有ExtraCover的Cover元素的AdditionalCoverResult信息。

我必须保留Cover的原始顺序,所以我不能做两个单独的循环,一个用于带有AdditionalCover的Cover,另一个用于没有AdditionalCover的Cover。

//Cover返回的节点集中,有没有办法确定上下文节点在 //Cover[AdditionalCover]返回的节点集中的位置?

我有点猜测,对于Cover元素,我需要考虑“我在 //Cover[AdditionalCover]中属于哪个索引,以便可以使用该索引来标识对应的AdditionalCoverResult元素?”

最佳答案

此转换:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/*">
<Insurances>
<xsl:apply-templates select="Cover"/>
</Insurances>
</xsl:template>

<xsl:template match="Cover">
<Insurance>
<xsl:apply-templates/>
</Insurance>
</xsl:template>

<xsl:template match="Cover_Ref">
<reference><xsl:value-of select="@Val"/></reference>
</xsl:template>

<xsl:template match="Cover_Code">
<CoverType><xsl:value-of select="@Val"/></CoverType>
</xsl:template>

<xsl:template match="AdditionalCover_Area">
<Region><xsl:value-of select="@Val"/></Region>

<Excluded>
<xsl:value-of select=
"/*/AdditionalCoverResult[CoverArea/@Val=current()/@Val]
[position()
=
1 +count(current()
/ancestor::Cover[1]
/preceding-sibling::Cover
[AdditionalCover
/AdditionalCover_Area/@Val
=
current()/@Val
]
)
]
/CoverExcluded/@Val
"/>
</Excluded>
</xsl:template>
</xsl:stylesheet>


当应用于提供的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>

关于xml - 确定上下文节点在另一个节点集中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10752319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com