得到其前面的第一个元素

时间:2014-05-05 15:05:21

标签: xslt xslt-2.0

我有以下示例xml树。

-root
  -para
   -page
   -footnum
  -para
   -footnum
  -para
   -footnum
  -para
   -page
   -footnum

我想在前面的第一页footnum上应用模板。来自footnum模板内部。在para下面会有更多节点但在这里我只想将模板应用于第一个footnum,然后是page,,无论它是在同一段还是不同。

我尝试的代码如下。

    <xsl:template match="footnote" mode="footnote">
   <xsl:variable name="rt">
<xsl:value-of select="//page/@num/following::footnote[1]/@num"/>   
   </xsl:variable>
   <xsl:value-of select="$rt"/>
 <xsl:if test="contains($rt,@num)">
   <xsl:variable name="op">&#60;</xsl:variable>
<xsl:variable name="apos">'</xsl:variable>
<xsl:variable name="cl">&#62;</xsl:variable>
<xsl:value-of select="concat($op,'?pb label=',$apos,./@num,$apos,'?',$cl)"/>
   </xsl:if>
        <div class="tr_footnote">
            <div class="footnote">
                <sup>
                <a>
                        <xsl:attribute name="name"><xsl:text>ftn.</xsl:text><xsl:value-of select="@num"/></xsl:attribute>
                        <xsl:attribute name="href"><xsl:text>#f</xsl:text><xsl:value-of select="@num"/></xsl:attribute>
                        <xsl:attribute name="class"><xsl:text>tr_ftn</xsl:text></xsl:attribute>
                        <xsl:value-of select="@num"/>
                    </a>
                </sup>

             <xsl:apply-templates/>
            </div>
        </div>
    </xsl:template>

更新

这里当我运行这个模板时,它给了我之前脚注的数字,但是这里我得到的是脚注编号,而不是页面编号。请让我知道如何检索页码。

这里是应用所有footnums的模板。请告诉我哪里出错了。

由于

2 个答案:

答案 0 :(得分:1)

如果(我认为你在说)你想要将apply-templates调用到带有前一个footnum元素的第一个page,那么你的第一个问题是你的apply-templates指令示例代码适用于页面元素,而不适用于footnum元素。

您的第二个问题(错误是在您的代码中还是在您的问题描述中)是您说您希望仅在某些情况下执行此操作(我不清楚您有什么条件 - 一个脚)每个文档,或者在页面元素之后的第一个页面上的每页元素,或者其他内容),但是您的代码中似乎没有任何测试可以测试您所考虑的条件。条件中的测试是preceding::page[1],它与preceding::page是同义的(作为布尔值),并且排除了出现在footnum元素之前的所有page元素。文档,包括所有其他文档。

假设您的页面元素标记分页符,并且您的footnum元素标记脚注数字,您想要的是为每页的第一个脚注(如果有的话)做一些特别的事情[如果这不对,那么您将拥有要对解决方案进行适当的调整],那么你需要找到一个XPath表达式,它为每个页面的第一个脚注返回true,而不是其他页面。

每页第一个脚的关键特征是什么?它与前一页之间没有其他的footnum元素。所以我们可以写(未测试):

<xsl:variable name="mypage" as="element(page)?"
  select="preceding::page[1]"/>
<xsl:variable name="preceding-footnum-on-same-page"
  as="element(footnum)?"
  select="preceding::footnum[preceding::page[. is $mypage]]"/>
<xsl:if test="$mypage and not($preceding-footnum-on-same-page)">
  ... do your stuff here ...
</xsl:if>

另一种表达方式是:当前节点是当前页面上的第一个空格,当我们找到当前页面然后找到它的第一个页脚时,它就是当前节点。

<xsl:if test=". is ./preceding::page[1]/following::footnum[1]">
  ...
</xsl:if>

我希望这会有所帮助。

答案 1 :(得分:1)

您已经在脚注中。要获取第一个前一页节点,必须使用

<xsl:variable name="rt" select="preceding-sibling::*[1][local-name()='page']/@num"/>