Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 获取其前一个元素的第一个元素_Xslt_Xslt 2.0 - Fatal编程技术网

Xslt 获取其前一个元素的第一个元素

Xslt 获取其前一个元素的第一个元素,xslt,xslt-2.0,Xslt,Xslt 2.0,下面是示例xml树 -root -para -page -footnum -para -footnum -para -footnum -para -page -footnum 我想在前面是第页的第一个footnum上应用模板。从footnum模板内部。下面的para将有更多节点,但这里我只想将模板应用于第一个footnum,然后是页面,,无论它是在同一个段落中还是不同的段落中 我尝试的代码如下 <xsl:template mat

下面是示例xml树

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

我尝试的代码如下

    <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>

<
'
>
更新:

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

在这里,它将为所有足迹应用模板。请告诉我哪里出了问题

谢谢

如果(正如我想你说的)你想用前面的
页面
元素调用apply templates到第一个
footnum
,那么你的第一个问题是你的示例代码中的apply templates指令应用到页面元素,而不是footnum元素

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

假设您的页面元素标记分页符,footnum元素标记脚注编号,并且您希望为每页上的第一个脚注(如果有)做一些特殊的事情[如果这不对,您必须对解决方案进行适当的调整],然后,您需要找到一个XPath表达式,该表达式对于每页的第一个脚注返回true,而对于其他脚注则不返回true

每页第一个footnum的关键特征是什么?在它和上一页之间没有其他footnum元素。因此我们可以编写(未经测试):


... 在这里做你的事。。。
另一种表述方式是:当前节点是当前页面上的第一个footnum,如果我们找到当前页面,然后找到它的第一个footnum,那么它就是当前节点

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

...

我希望这会有所帮助。

您已经进入脚注上下文。要获取前面的第一个页面节点,必须使用

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


Hi@CNSperberg:感谢您的详细解释,这里用两个字来说,模板应该应用于从根开始的任何地方页面的第一个兄弟是脚注,前面的两个逻辑都不起作用,不幸的是它们不起作用我试过了Thanks@user2423959 总之,模板应该应用于从根开始的任何地方。页面的第一个同级是脚注,这两种逻辑都在前面“我认为没有人能理解你在这里说的话——这甚至不是一句话。嗯,这里的主要问题是理解你想要什么。我怀疑,如果你能用简单的英语解释你的需求,XSLT公式将遵循。嗨,Joel,这不再起作用了,我正在用我所尝试的更新我的问题,我觉得我很接近,但仍然存在一些问题。再次编辑,我想你必须更改变量
rt
<xsl:variable name="rt" select="preceding-sibling::*[1][local-name()='page']/@num"/>