gpt4 book ai didi

xml - 使用xsl:key测试前一个同级和匹配后代

转载 作者:行者123 更新时间:2023-12-03 16:47:48 27 4
gpt4 key购买 nike

我有一个问题,我认为我需要使用使用xsl:key的分组来解决,但是我对正确的语法感到困惑。对于以下XML,当我处理每个<a/>元素时,我需要测试以查看是否


该元素具有一个具有相同ID的前一个同级<markerStart/>元素和一个后代</markerEnd>元素。


“前兄弟”是指当前元素和<a/>之间不能有<markerStart/>,因此标记为<a/><!-- # 5 -->应该返回false,标记为<a/><!-- # 1 -->和标记为<a/>的元素之后的第一个<!-- # 2a -->应该返回true。
“后代”是指在<a/>之前不能有<markerEnd/>后代,因此标记为<a/><!-- # 0 -->和标记为<a/>的元素后的第一个<!-- # 2b -->应该返回false。

或元素具有后代<markerStart/>元素和后代</markerEnd>元素具有相同的ID。


“后代”是指在<a/>之前不能有<markerEnd/>后代。



对于以下XML,我希望标记有<!-- # 1 --><!-- # 2a --><!-- # 4 -->的节点返回true。

<root>
<a><!-- # 0 -->
<b>
<c>
<markerStart id="a1"/>
<a> <!-- # 1 -->
<b>
<c>
<markeEnd id="a1"/>
</c>
</b>
</a>
<markerStart id="a2"/><!-- # 2a -->
<markerStart id="a3"/><!-- # 2b -->
<a><!-- # 2 -->
<b>
<c>
<markeEnd id="a2"/>
<a><!-- # 3 -->
<b>
<c>
<markeEnd id="a3"/>
</c>
</b>
</a>
</c>
</b>
</a>
<markerStart id="a5"/>
<a><!-- # 4 -->
<markerStart id="a4"/>
<b>
<c>
<markeEnd id="a4"/>
</c>
</b>
</a>
<a><!-- # 5 -->
<b>
<c>
<markeEnd id="a5"/>
</c>
</b>
</a>
</c>
</b>
</a>
</root>


我需要针对此问题使用XSL 1.0。任何帮助都超过了赞赏。

最佳答案

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kMarkerStartByFollowingMarkeEnd"
match="markerStart"
use="generate-id(following::markeEnd[1])"/>
<xsl:key name="kMarkeEndByAncestorA"
match="markeEnd"
use="generate-id(ancestor::a[1])"/>
<xsl:template match="a[key('kMarkeEndByAncestorA',
generate-id()
)[1]/@id =
key('kMarkerStartByFollowingMarkeEnd',
generate-id(key('kMarkeEndByAncestorA',
generate-id()
)[1])
)/@id]">
<xsl:copy-of select="comment()"/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>


输出:

<!-- # 1 --><!-- # 2 --><!-- # 4 -->

关于xml - 使用xsl:key测试前一个同级和匹配后代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5274701/

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