2016-02-17 33 views
0

我有一段未知数的段落,我想将其格式化为两列表格。所以,如果我有偶数个段落,我想从XSLT将段落划分为两列表格

<doc> 
<p>Paragraph 1</p> 
<p>Paragraph 2</p> 
<p>Paragraph 3</p> 
<p>Paragraph 4</p> 
</doc> 

<table> 
    <row> 
    <entry> 
     <p>Paragraph 1</p> 
     <p>Paragraph 2</p> 
    </entry> 
    <entry> 
     <p>Paragraph 3</p> 
     <p>Paragraph 4</p> 
    </entry> 
    </row> 
</table> 

如果我有奇数个段落,我希望把它与一个分裂更多在第一栏(7段= 4/3,11段= 6/5等)。

我很难弄清楚如何遍历段落并将它们放在适当的列中。无论如何,我需要开始/结束表格,唯一真正的挑战是决定何时结束第1列和开始第2列。我想我需要在开始之前存储段落的数量,然后在达到第2列时移动到第2列正确的段落号码,但我遇到了麻烦。

任何帮助,非常感谢。

回答

1

首先,你可以让你在第一项要p元素数量的计数:

<xsl:variable name="count" select="ceiling(count(p) div 2)" /> 

然后你可以选择出现在位置1和count + 1的位置p元素,这些代表每个entry

<xsl:for-each select="p[position() = 1 or position() = $count + 1]"> 

的第一个元素然后你可以选择p标签,像这样每个条目:

<xsl:apply-templates select="self::p|following::p[position() &lt; $count]" /> 

试试这个XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="doc"> 
     <table> 
      <row> 
      <xsl:variable name="count" select="ceiling(count(p) div 2)" /> 
      <xsl:value-of select="$count" /> 
      <xsl:for-each select="p[position() = 1 or position() = $count + 1]"> 
       <entry> 
        <xsl:apply-templates select="self::p|following::p[position() &lt; $count]" /> 
       </entry> 
      </xsl:for-each> 
      </row> 
     </table> 
    </xsl:template> 
</xsl:stylesheet> 
0

一种可能实现这一目标是下面的XSLT片段。它将position() < ((last() of element p)/2+1)与那些不在该节点集中的计数区分开来。其余的只是简单地复制,并在doc模板中创建(确认为最佳实践)的周围元素。

<xsl:template match="/doc"> 
    <xsl:element name="table"> 
     <xsl:element name="row"> 
      <xsl:element name="entry"> 
       <xsl:apply-templates select="p[position() &lt; (last() div 2)+1]" /> 
      </xsl:element> 
      <xsl:element name="entry"> 
       <xsl:apply-templates select="p[not(position() &lt; (last() div 2)+1)]" /> 
      </xsl:element> 
     </xsl:element> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="p"> 
    <xsl:copy-of select="." /> 
</xsl:template> 
+0

这也适用。谢谢 – user3198443