gpt4 book ai didi

Xslt 访问 for-each 循环的前一个元素

转载 作者:行者123 更新时间:2023-12-01 06:34:53 24 4
gpt4 key购买 nike

假设我们有以下源 xml。

<Data Key="SS_001PG"
OC:DataId="001PG"
OC:UniqueIdentifier="01-003"
OC:Status="available"
OC:DateOfBirth="2010-06-29"
OC:Sex="m">
<Event EventOID="123"
OC:EventLocation="we"
OC:StartDate="2010-07-12"
OC:Status="started"
OC:Age="0"
EventRepeatKey="1"></Event>
<Event EventOID="123"
OC:StartDate="2010-07-14"
OC:Status="started"
OC:Age="0"
EventRepeatKey="2"></Event>
</Data>
<Data Key="SS_1"
OC:DataId="1"
OC:UniqueIdentifier="1"
OC:Status="available"
OC:DateOfBirth="2010-07-14"
OC:Sex="m">
<Event EventOID="123"
OC:StartDate="2010-07-16"
OC:EndDate="2010-07-14"
OC:Status="started"
OC:Age="-1"
EventRepeatKey="1"></Event>
</Data>

我们有以下 xslt 代码来处理它。

<xsl:variable name="repeatedEvents" select="//Event[@EventOID='123']"/>
<xsl:for-each select="$repeatedEvents">
<xsl:sort select="@EventRepeatKey" data-type="number"/>
<xsl:variable name="prevIndex" select="position()-1"/>
<xsl:variable name="prevEvent"
select="$repeatedEvents[position()=$prevIndex]"/>
<xsl:choose>
<xsl:when test="position()=1">
<xsl:value-of select="@EventRepeatKey"/>
</xsl:when>
<xsl:otherwise>
<xsl:if test="$prevEvent/@EventRepeatKey != @EventRepeatKey">
<xsl:value-of select="@EventRepeatKey"/>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>

现在,如您所见,我们正在选择具有相同 EventOID 的所有事件,然后使用 EventRepeatkey 对元素进行排序。因此,排序后,第二个数据下的事件位于第一个数据的事件之间。在循环内部,在处理第二个元素时,我们可以使用之前的索引访问第一个元素,但是当处理第三个元素时,我们不能使用之前的索引访问第二个元素。这是因为第二个元素在树中的位置低于第三个元素吗?有什么建议可以解决这个问题吗?

有人可以帮忙吗?

最佳答案

看来你要进行分组

这里是一个简单的使用 Muenchian 方法进行分组的例子:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:key name="kEvByRepK" match="Event[@EventOID='123']"
use="@EventRepeatKey"/>

<xsl:template match=
"Event[@EventOID='123'
and
generate-id()
=
generate-id(key('kEvByRepK', @EventRepeatKey)[1])
]">
<xsl:value-of select="@EventRepeatKey"/>
<xsl:text>&#xA;</xsl:text>
</xsl:template>
</xsl:stylesheet>

当对以下 XML 文档执行此转换时(包装提供的格式不正确的片段):

<t xmlns:OC="my:OC" >
<Data Key="SS_001PG" OC:DataId="001PG" OC:UniqueIdentifier="01-003"
OC:Status="available" OC:DateOfBirth="2010-06-29" OC:Sex="m">
<Event EventOID="123" OC:EventLocation="we" OC:StartDate="2010-07-12"
OC:Status="started" OC:Age="0" EventRepeatKey="1"/>
<Event EventOID="123" OC:StartDate="2010-07-14" OC:Status="started"
OC:Age="0"
EventRepeatKey="2"/>
</Data>
<Data Key="SS_1" OC:DataId="1" OC:UniqueIdentifier="1" OC:Status="available"
OC:DateOfBirth="2010-07-14" OC:Sex="m">
<Event EventOID="123" OC:StartDate="2010-07-16" OC:EndDate="2010-07-14"
OC:Status="started" OC:Age="-1" EventRepeatKey="1"/>
</Data>
</t>

产生了想要的、正确的结果:

1
2

解释:阅读关于 the Muenchian method for grouping .

关于Xslt 访问 for-each 循环的前一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4818376/

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