我有几个XML标记,我想放在四个块(div)中。
输入如下:
<product>
<product1>1</product1>
<product2>2</product2>
<product3>3</product3>
<product4>4</product4>
<product5>5</product5>
<product6>6</product6>
<product7>7</product7>
<product8>8</product8>
</product>
我想要的输出是:
<div><span>1</span> <span>5</span></div>
<div><span>2</span> <span>6</span></div>
<div><span>3</span> <span>7</span></div>
<div><span>4</span> <span>8</span></div>
以下是我尝试http://clip2net.com/s/1fON5
的图片链接这里的表不会很好,因为我需要四个独立的块。
任何帮助表示赞赏!
答案 0 :(得分:2)
假设您定义了一个名为 blocks 的参数,只需执行以下操作即可匹配每个块中的第一个元素:
<xsl:apply-templates select="product/*[position() <= $blocks]" />
在匹配此类元素的模板中,您需要选择元素本身,然后选择块的所有后续元素(这将取决于块的数量),如此
<xsl:apply-templates
select="self::*|following-sibling::*[position() mod $blocks = 0]"
mode="block" />
注意模式这里是以递归方式调用自身来停止模板。在匹配模板中,您可以在案例中添加 span 标记的代码。
因此,给出以下XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:param name="blocks" select="4" />
<xsl:template match="/">
<xsl:apply-templates select="product/*[position() <= $blocks]" />
</xsl:template>
<xsl:template match="product/*">
<div>
<xsl:apply-templates
select="self::*|following-sibling::*[position() mod $blocks = 0]"
mode="block" />
</div>
</xsl:template>
<xsl:template match="*" mode="block">
<span><xsl:value-of select="." /></span>
</xsl:template>
</xsl:stylesheet>
当应用于您的示例XML时,输出以下内容:
<div><span>1</span><span>5</span></div>
<div><span>2</span><span>6</span></div>
<div><span>3</span><span>7</span></div>
<div><span>4</span><span>8</span></div>
将参数更改为3,输出以下内容
<div><span>1</span><span>4</span><span>7</span></div>
<div><span>2</span><span>5</span><span>8</span></div>
<div><span>3</span><span>6</span></div>