这与 question 有关前段时间我问过。鉴于此 xml:
<?xml version="1.0"?>
<paper>
<section><title>My Main Section</title>
<para>My para with a <footnote num="a">text</footnote> footnote.</para>
<section><title>my subsection</title>
<para>more text with another <empty/><footnote num="b">more fn text. </footnote> footnote.</para>
</section>
</section>
</paper>
我想要一个来自/paper/section 节点的 xpath,它只会给我第一个脚注 (@num="a")
我已经尝试了一些类似的东西:
<xsl:template match="/paper/section">
<section>
<xsl:apply-templates select="//footnote[1]"/>
</section>
</xsl:template>
但这会返回两个 fn。我假设因为每个 fn 都是其各自父级中的第一个脚注节点。
我尝试了一些变化:
<xsl:apply-templates select="//footnote[position() = 1 ]"/>
这将返回一个脚注,它是其父级的第一个子级,或与 1 相同?我所做的测试表明它们是相同的。
我还尝试了一个 for-each 循环,但无法拾取任何东西......
有任何想法吗?
bp
最佳答案
I have tried something along the lines of:
<xsl:template match="/paper/section"> <section> <xsl:apply-templates select="//footnote[1]"/> </section> </xsl:template>
but that returns both fn's.
这是一个常见问题解答。参见示例 this answer .
XPath
[]
运算符的绑定(bind)比 //
更强(具有更高的优先级)伪运算符 .这就是为什么,
//x[1]
全选
x
文档中的第一个 x
元素他们 parent 的 child 。在 XPath 中,就像在数学中一样,要覆盖运算符的默认优先级,可以使用括号。
使用 :
(//x)[1]
在这种特殊情况下 , 代入
x
使用特定的元素名称,给我们这个表达式:(//footnote)[1]
如果第一个
footnote
需要文档的特定子树中的元素,请使用: (.//footnote)[1]
其中用于评估表达式的上下文(当前)节点是子树的根
解释 :
//
实际上不是 XPath 运算符——它只是一个简写。引用 W3C XPath 1.0 specification :// is short for /descendant-or-self::node()/
这意味着 :
//x[1]
扩展为 :
/descendant-or-self::node()/x[1]
这会选择任何
x
第一个 x
的元素作为根(文档)节点的后代的任何节点的子节点。请注意上面的表达式与:
/descendant::x[1]
因此,这两个表达式选择的节点集通常是不同的。
关于xslt - 从上下文节点获取给定类型的第 n 个后代节点,它们可能不是兄弟节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29954801/