考虑(手写代码,请原谅任何意外)
<xsl:variable name="foo" as="document-node()">
<xsl:document>
<foo1>
<foo2>
<foo3>
</xsl:document>
</xsl:variable>
<xsl:variable name="foos" select="$foo/*"/>
<xsl:variable name="isItFoo3" select="$foos[2]::following-sibling"/>
isItFoo3 是
<foo3>
不错
但是这个
<xsl:variable name="foos" as="element()*">
<foo1>
<foo2>
<foo3>
</xsl:variable>
<xsl:variable name="isItFoo3" select="$foos[2]::following-sibling"/>
结果为空
因此,我假设以下兄弟姐妹需要一个父级(根据定义!),并且我的第二个示例中的文字元素在某种意义上是孤立的,因此它们不是兄弟姐妹。
这使得轴有点微妙,如果我想处理(有效地获取“尾部”)序列,我需要确保所有元素都有一个父元素并共享相同的父元素。
很公平,这是合乎逻辑的。
但是当我不确定元素的出身时,如何获得序列中的尾部(以下兄弟姐妹)?
(好吧,我可以明确地将它们复制到新文档中以确保,但这在代码和性能方面有点繁重)
所以你可以这样做
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all">
<xsl:variable name="foos" as="element()*">
<foo1/>
<foo2/>
<foo3/>
<foo4/>
</xsl:variable>
<xsl:variable name="foo2" select="$foos[2]"/>
<xsl:variable name="foos-after-foo2" select="let $pos := index-of($foos!generate-id(), generate-id($foo2)) return $foos[position() gt $pos]"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/" name="xsl:initial-template">
<xsl:sequence select="$foos-after-foo2"/>
</xsl:template>
</xsl:stylesheet>
我认为它可以在 XPath/XSLT 4 中更紧凑地表达,但我需要检查哪些函数和/或表达式当前是标准化的。