以下是示例代码:
XML
<docbody>
<p>This is the main paragraph</p>
<ul>This is a list element!</ul>
--{add thousands of lines of code}--
<a name='#r1'>Hello</a>
<p>Footnotes begin</p>
<ul>This text should be rendered right below footnote</ul>
</docbody>
这似乎很好。但是,我转换此XML文件的XSLT代码添加了类“paragraphtext”,它强制<ul>
元素中的任何文本进入段落,而不是在我需要的脚注正下方。
总而言之,我需要样本中的第二个<ul>
元素保持在脚注下方,而不是按照给定的类强制进入段落(我无法更改CSS或任何类的内容) )。
我认为我可以这样做的方式是以某种方式检测第二个<ul>
元素的位置 - 尽管这两个元素都具有相同的父元素,但可能有所帮助事实是<a name="#r1">
元素只在并始终位于脚注部分之前 - 它永远不会在文档正文部分找到。
因此,我想如果有一种方法可以测试<ul>
元素在 a
元素之后是否来自starts-with[@name, '#r1']
,但是似乎position()
函数没有参数?
那么,有没有办法以某种方式“检测”a
元素的位置并将其与ul
元素的位置进行比较?感谢。
修改:
我拥有的XSLT是10000行代码,但这里是相关部分:
<xsl:template match="ul">
<div>
<xsl:attribute name="class">
<xsl:value-of select="'paragraphtext'" />
</xsl:attribute>
<xsl:apply-templates />
</div>
</xsl:template>
我目前收到的文字:
Lorem ipsum dolor坐下来,精神上的精神。 Donec简历 dolor cursus,aliquet purus eget,placerat augue。 Morbi blandit,risus ac dignissim dapibus,lectus ipsum venenatis augue,malesuada magna purus et quam。 Curabitur tincidunt eleifend orci,et tempor nunc laoreet at。 Nullam vitae mauris nisi。 脚注正文在这里 而不是在相关脚注之后。
脚注
(1)参考文献1
(2)参考文献2
我想要获取的文字:
Lorem ipsum dolor坐下来,精神上的精神。 Donec简历 dolor cursus,aliquet purus eget,placerat augue。 Morbi blandit,risus ac dignissim dapibus,lectus ipsum venenatis augue,malesuada magna purus et quam。 Curabitur tincidunt eleifend orci,et tempor nunc laoreet at。 Nullam vitae mauris nisi。
脚注
(1)参考文献1
**Footnote body goes here - this is the correct way**
(2)参考文献2
答案 0 :(得分:1)
您可以使用preceding-sibling
轴。
直接选择第二个ul:
<xsl:value-of select="/docbody/ul[preceding-sibling::ul]"/>
在for循环中使用条件:
<xsl:for-each select="/docbody/ul">
<xsl:if test="normalize-space(preceding-sibling::ul)">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
答案 1 :(得分:1)
听起来你想在这里使用前兄弟轴来测试(对于匹配的 ul 元素)是否存在符合条件的前一个兄弟< / p>
<xsl:template match="ul">
<xsl:if test="preceding-sibling::a[starts-with(@name, '#r1')]">Do stuff</xsl:if>
但如果你把它写成一个单独的模板匹配
,它实际上会更清晰 <xsl:template match="ul[preceding-sibling::a[starts-with(@name, '#r1')]]">
如果元素与额外条件匹配,XSLT将优先考虑具有条件的元素。因此,对于 a 后面的 ul 元素,将始终使用第二个模板。
这两个模板看起来像这样:
<xsl:template match="ul">
<div class="paragraphtext">
<xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="ul[preceding-sibling::a[starts-with(@name, '#r1')]]">
<div class="Hurrah">
<xsl:apply-templates />
</div>
</xsl:template>
请注意,在创建类属性时无需使用 xsl:attribute 。直接把它写出来。