2016-02-17 3 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, когда я номер правого абзаца, но у меня возникают проблемы с этим.

Любая помощь очень ценится.

ответ

1

Во-первых, вы можете получить подсчет количества p элементов, которые вы хотите в первой записи:

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

Затем вы можете выбрать p элементы, которые происходят в положении 1 и положении count + 1, как они представляют собой первый элемент в каждом 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

Смежные вопросы