继续此链接xslt return selection of following siblings
我只是想知道,这里是generate-id
的目的是什么,以及它在这个匹配协议中是如何理解的。
<xsl:for-each select="/items/item[@lcn='005417714']">
<xsl:for-each select="following-sibling::*[generate-id(preceding-sibling::item[@lcn != ''][1]) = generate-id(current())]">
</xsl:for-each>
</xsl:for-each>
任何想法,请分享。
答案 0 :(得分:13)
generate-id
的规范是它将始终为同一节点返回相同的ID,并为不同的节点返回不同的ID。因此,比较两个节点的generate-id
值是检查它们是否是相同节点的方式,而不是只有两个恰好具有相同值的节点。
current()
为您提供当前的“顶级”上下文节点 - 谓词current()
之外与.
相同,但在谓词表达式.
中引用到谓词正在测试的节点,而current()
仍然引用“外.
”。
现在在你的例子中
following-sibling::*[generate-id(preceding-sibling::item[@lcn != ''][1])
= generate-id(current())]
外部上下文节点是item
元素(外部for-each
当前正在查看的元素)。因此,从item
开始,表达式将选择:
following-sibling::* --- all the following sibling elements
[ --- such that
generate-id( --- the identity of
preceding-sibling::item[@lcn != ''][1] --- that element's nearest preceding
item with a non-empty lcn attribute
)
= --- is the same as
generate-id(current()) --- the identity of the item we started
with
]
换句话说,这个<item lcn="005417714">
(不包括)和下一个<item lcn="anything-non-empty">
(包括)之间的所有兄弟元素。
以相关问题为例:
<item id="00100687" label="A/161i r" lcn="005417714" notes="A/161-182"/>
<item id="00100688" label="A/161i v" lcn="" notes=""/>
<item id="00100819" label="A/182ii v" lcn="" notes=""/>
<item id="00100820" label="A/182iii r" lcn="" notes=""/>
<item id="00100821" label="A/182iii v" lcn="" notes=""/>
<item id="00100822" label="A/183i r" lcn="005417715" notes="A/183-218"/>
<item id="00100823" label="A/183i v" lcn="" notes=""/>
<item id="00100975" label="A/216iii r" lcn="" notes=""/>
如果当前上下文节点是带有item
的{{1}},则该选择将提取项目00100688,00100819,00100820,00100821和00100822.如果要排除00100822,则必须添加另一个谓词
id="00100687"