我有以下示例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"><</xsl:variable>
<xsl:variable name="apos">'</xsl:variable>
<xsl:variable name="cl">></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的模板。请告诉我哪里出错了。
由于
答案 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"/>