0

这是示例代码:

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">元素仅且始终位于脚注部分之前 - 它永远无法在文档正文部分找到。

因此,我想是否有办法测试元素是否位于名称为 that的<ul>元素之后,但该函数似乎没有参数?astarts-with[@name, '#r1']position()

那么,有没有办法以某种方式“检测”a元素的位置并将其与元素的位置进行比较ul?谢谢。

编辑

我拥有的 XSLT 是 10 000 行代码,但这里是相关部分:

  <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 sit amet, consectetur adipiscing elit。Donec vitae dolor cursus, aliquet purus eget, placerat augue。Morbi blandit, risus ac dignissim dapibus, lectus ipsum venenatis augue, amalesuada magna purus et quam。Curabitur tincidunt eleifend orci, et tempor nunc laoreet 在。Nullam vitae mauris nisi。脚注正文放在此处而不是在相关脚注之后。

脚注

(1) 参考文献1

(2) 参考文献2

我想得到的文字:

Lorem ipsum dolor sit amet, consectetur adipiscing elit。Donec vitae dolor cursus, aliquet purus eget, placerat augue。Morbi blandit, risus ac dignissim dapibus, lectus ipsum venenatis augue, amalesuada magna purus et quam。Curabitur tincidunt eleifend orci, et tempor nunc laoreet 在。Nullam vitae mauris nisi。

脚注

(1) 参考文献1

**Footnote body goes here  - this is the correct way**

(2) 参考文献2

4

2 回答 2

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>
于 2013-10-16T16:43:54.080 回答
1

听起来你想在这里使用前面的兄弟轴,来测试(对于匹配的ul元素)是否有前面的兄弟匹配你的条件

 <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。直接写出来就好了。

于 2013-10-16T16:47:27.533 回答