xslt - 从上下文节点获取给定类型的第 n 个后代节点,它们可能不是兄弟节点

标签 xslt xpath

这与 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/

相关文章:

php - 在 XSLT 中进行文件路径操作

.net - 有没有一种方法可以使用 c# 或 vb 从 xml 递归地找到最里面的节点

python - Scrapy 提取ld+JSON

xml - 关于根节点的简单 XPath 问题

java - 在 java 中表示 XPath 列表的最佳方式

xml - 为什么 XML 不显示在浏览器中,但在 XML Notepad 2007 (Microsoft) 中正确显示?

xml - 如何使用 xslt 2.0 进行此特定查询?

sorting - XSLT 数字节点不排序

xml - 重命名元素并保留属性

c# - 读取 <property> 标签