我知道这里有一些问题,我尝试了很多解决方案,但我仍然陷入困境。 我尝试使用此pagination in xsl 而这Possible to split XML into multiple pages with XSLT?却没有得到我需要的东西,
我需要在生成的html中创建一个分页,使用XML通过XSLT解析器。
XML文件就像这样
<root>
<result>
<a>field one</a>
<b>field two</b>
<c>field three</c>
</result>
<result>
<a>hello</a>
<b>thanks</b>
<c>for help</c>
</result>
<result>
<a>thank</a>
<b>you</b>
<c>!!</c>
</result>
.....
</root>
我的XSLT没有分页就是这个
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="http://mycompany.com/mynamespace">
<xsl:output method="html" indent="yes" />
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="root">
<xsl:for-each select="result">
<div class="list_item">
<div class="dmv_line">
<div class="box_text">
<h2><xsl:value-of select="a"/></h2>
</div>
</div>
<div class="dmv_line">
<div class="box_text">
<h2><xsl:value-of select="b"/></h2>
</div>
</div>
<div class="dmv_line">
<div class="box_text">
<h2><xsl:value-of select="c"/></h2>
</div>
</div>
</div>
</div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我需要的是创建一个{3},将结果3乘3或4乘4封装,我将在javascript中隐藏或显示。 感谢
[编辑]: HTML输出,如果我假设每页分页2个元素,并且仅考虑示例中的3个元素,则输出应为
<div>
答案 0 :(得分:1)
对于这样的问题,方法是首先选择将在每个“页面”上首先出现的元素。这是通过检查其位置来实现的。
<xsl:for-each select="result[position() mod $size = 1]">
因此,如果 $ size 变量设置为2,则会在位置1,3,5等中选择结果元素...
在此循环中,您可以输出包含
<div id="{position()}">
请注意,position是上下文相关的,它将返回您刚刚选择的节点集中节点的位置(即它将返回1,2,3等)
最后,要获得构成“页面”的结果元素,您可以选择它们
<xsl:apply-templates select="self::*|following-sibling::*[position() < $size]" />
匹配它们的模板实际上就像 xsl:for-each 中的现有代码一样。
尝试以下XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="size" select="2"/>
<xsl:output method="html" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="root">
<xsl:for-each select="result[position() mod $size = 1]">
<div id="{position()}">
<xsl:apply-templates select="self::*|following-sibling::*[position() < $size]"/>
</div>
</xsl:for-each>
</xsl:template>
<xsl:template match="result">
<div class="list_item">
<div class="dmv_line">
<div class="box_text">
<h2>
<xsl:value-of select="a"/>
</h2>
</div>
</div>
<div class="dmv_line">
<div class="box_text">
<h2>
<xsl:value-of select="b"/>
</h2>
</div>
</div>
<div class="dmv_line">
<div class="box_text">
<h2>
<xsl:value-of select="c"/>
</h2>
</div>
</div>
</div>
</xsl:template>
</xsl:stylesheet>
这应该可以为您提供所需的输出。
顺便说一下,你的代码中有一些代码重复。尝试使用这两个模板替换匹配结果的模板:
<xsl:template match="result">
<div class="list_item">
<xsl:apply-templates select="a|b|c" />
</div>
</xsl:template>
<xsl:template match="result/*">
<div class="dmv_line">
<div class="box_text">
<h2>
<xsl:value-of select="."/>
</h2>
</div>
</div>
</xsl:template>