将XML内容放在四个HTML块中

时间:2011-10-20 10:44:01

标签: xslt

我有几个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

的图片链接

这里的表不会很好,因为我需要四个独立的块。

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

假设您定义了一个名为 blocks 的参数,只需执行以下操作即可匹配每个块中的第一个元素:

<xsl:apply-templates select="product/*[position() &lt;= $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() &lt;= $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>