7

我有一个带有chapters嵌套的 XML 文档sections。我正在尝试为任何部分查找第一个二级部分祖先。那是ancestor-or-self轴中的倒数第二部分。伪代码:

<chapter><title>mychapter</title>
  <section><title>first</title>
     <section><title>second</title>
       <more/><stuff/>
     </section>
  </section>
</chapter>

我的选择器:

<xsl:apply-templates 
    select="ancestor-or-self::section[last()-1]" mode="title.markup" />

当然,直到 last()-1 没有定义(当前节点是first节)之前,它都有效。

如果当前节点在该second部分下方,我想要标题second。否则我想要标题first

4

2 回答 2

5

用这个替换你的xpath:

ancestor-or-self::section[position()=last()-1 or count(ancestor::section)=0][1]

由于您已经可以在除一个之外的所有情况下找到正确的节点,因此我更新了您的 xpath 以找到部分first( or count(ancestor::section)=0),然后选择 ( [1]) 第一个匹配项(以相反的文档顺序,因为我们使用的是ancestor-or-self轴)。

于 2012-05-02T20:17:04.947 回答
2

这是一个更短更有效的解决方案

(ancestor-or-self::section[position() > last() -2])[last()]

这将选择名为 的可能前两个最顶层祖先中的最后一个section。如果只有一个这样的祖先,那么它本身就是最后一个。

这是一个完整的转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="section">
  <xsl:value-of select="title"/>
  <xsl:text> --> </xsl:text>

  <xsl:value-of select=
  "(ancestor-or-self::section[position() > last() -2])[last()]/title"/>
  <xsl:text>&#xA;</xsl:text>
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

当此转换应用于以下文档时(基于提供,但添加了更多嵌套section元素):

<chapter>
    <title>mychapter</title>
    <section>
        <title>first</title>
        <section>
            <title>second</title>
            <more/>
            <stuff/>
        <section>
            <title>third</title>
        </section>
        </section>
    </section>
</chapter>

产生正确的结果

first --> first
second --> second
third --> second
于 2012-05-03T02:56:47.963 回答