如何使用xslt获取xml的前半部分?

时间:2014-07-03 17:10:02

标签: xml xslt xslt-1.0

我有以下xml:

<root>
 <elements>
  <element>
     <data1>Foo</data1>
     <data2>Bar</data2>
  </element>
  <element>
     <data1>Foo1</data1>
     <data2>Bar1</data2>
  </element>
  <element>
     <data1>Foo2</data1>
     <data2>Bar2</data2>
  </element>
  <element>
     <data1>Foo3</data1>
     <data2>Bar3</data2>
  </element>
 </elements>
</root>

我想在结构(html表)中获取列表的前半部分,在另一个结构中获取第二部分。

我正在尝试这个:

<xsl:template match="root">
<xsl:variable name="set" select="elements/element" />
<xsl:variable name="count" select="count($set)" />
<xsl:for-each select="elements/element" >
  <xsl:if test="position() &lt; $count div 2" >
    <table>
        <xsl:apply-templates select="elements/element" />
    </table>
  </xsl:if>
  <xsl:else>
    <table>
        <xsl:apply-templates select="elements/element" />
    </table>
  </xsl:else>                      
</xsl:for-each>

我有两个问题: 1.其他人不允许参加。 2.除了计算元素和使用foreach之外,还有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

您只需使用

即可
<xsl:template match="root">
  <xsl:variable name="set" select="elements/element" />
  <xsl:variable name="count" select="count($set)" />

    <table>
        <xsl:apply-templates select="$set[position() &lt; $count div 2]" />
    </table>

    <table>
        <xsl:apply-templates select="$set[position() >= $count div 2]" />
    </table>


</xsl:template>

答案 1 :(得分:0)

是的,我在发布之后意识到我可以选择

<table>
<xsl:apply-templates select='documents/document[(position()+1) mod 2 = 0]' />
</table>
<table>
<xsl:apply-templates select='documents/document[(position()+1) mod 2 = 1]' />
</table>
我认为马丁的解决方案也应该有效。我认为接受他的解决方案是公平的,即使我的不需要计算元素。

注意:此解决方案无法解决原始问题。第一个表不包含原始xml的前半部分,而是包含原始xml中偶数位置的数据。第二个表将包含奇数位置的数据。我的原始xml没有订购,所以这对我有用。