XSLT-选择在另一个节点之后的节点
我正在尝试选择1)具有特定属性的节点和2)具有特定属性的所有节点。因此,如果我具有以下XML:
<node id=\"1\"><child attr=\"valueOfInterest\"/></node>
<node id=\"2\"><child attr=\"boringValue\"/></node>
...
<node id=\"3\"><child attr=\"valueOfInterest\"/></node>
<node id=\"4\"><child attr=\"boringValue\"/></node>
<node id=\"5\"><child attr=\"boringValue\"/></node>
<node id=\"6\"><child attr=\"boringValue\"/></node>
...
我的XSLT遍历每个node
标记。在每个ѭ1上,我希望它选择从最近的node
中出现的所有node
,其中最近的node
具有child
,而attr
是valueOfInterest
。因此,如果我在节点2上,则需要一个空节点集。如果我在节点#6上,我想选择节点#\的4和5。我目前有以下XSLT:
<xsl:variable name=\"prev_vals\"
select=\"preceding-sibling::node/child[@attr = $someValueICareAbout]/@attr\"/>
因此,此XSLT获得所有前面的特定值attr
值。我该如何只获得那些在ѭ1preceding中位于node
之后的值,这些值在最近的ѭ1after之后,而其最近的ѭ5中具有特定的attr
值(即\“ valueOfInterest \”)?不能保证node
标签上的id
属性会增加,因此我们无法与之相比。
编辑:我认为这些可能是有用的:
<xsl:variable name=\"prev_children_of_interest\"
select=\"preceding-sibling::node/child[@attr != $someValueICareAbout]\"/>
<xsl:variable name=\"mru_child_of_interest\"
select=\"$prev_children_of_interest[count($prev_children_of_interest)]\"/>
因此,这是所有带有ѭ19的child
标记,然后是具有我正在寻找的属性的最近使用的(最接近当前节点的)child
标记。从mru_child_of_interest
,我们可以找到最近使用的parent
标签,但是我们如何查找该标签之后的节点?
没有找到相关结果
已邀请:
4 个回复
筷啸够对铅
属性仅供参考):
输入XML:
结果XML:
翰冒绢县
应用于此XML文档时(基于提供的XML片段并将其包装在top元素中,以使其成为格式正确的XML文档):
所需的正确结果产生了:
说明: 在这里,我们对两个节点集
和
的交集使用著名的Kayessian公式(由SO用户@Michael Kay发现): ns1 [count(。| $ ns2)= count($ ns2)] 在上述公式中,我们仅用
和
代替
和
。 满足条件的“ 36节点”到“ 37节点”。 “ 33”是当前(匹配)节点的同级元素中所有“ 1”元素的集合。 .3。它们的交集正是所需的节点集。
久坡
之后的所有节点。集2是当前节点之前的所有不包含7的节点。对于XPath 1.0,以下内容将为您提供交叉点(在此处找到参考)。
根据您的输入,以下XSL演示了您要寻找的节点集
这是输出
注意,我在
中使用
的原因是因为节点集的顺序被
颠倒了,请参见此处。 如果您具有XPath 2.0,则可以使用
运算符
这将产生相同的结果。
钾涎净介