我有以下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() < $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之外,还有更好的解决方案吗?
答案 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() < $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没有订购,所以这对我有用。