XSLT и таблицы: установка количества ячеек в ряду - PullRequest
1 голос
/ 22 марта 2011

XML:

<data>  
    <table id="returns">  
        <each>  
            <name>1 year</name>  
            <value>17.01062531999216</value>  
        </each>  
        <each>  
            <name>3 years</name>  
            <value>18.01062531999216</value>  
        </each>  
        <each>  
            <name>5 years</name>  
            <value>21.01062531999216</value>  
        </each>  
        <each>  
            <name>Since inception</name>  
            <value>12.01062531999216</value>  
        </each>  
    </table>  
</data>

XSL, который я пробовал:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <tr>
            <xsl:for-each select="data/table[@id='returns']/each">
                <td><xsl:value-of select="name"/></td>
                <td><xsl:value-of select="value"/></td>
                <xsl:if test="//each[position() mod 2 = 0]">
                    <xsl:text disable-output-escaping="yes"></tr><tr></xsl:text>
                </xsl:if>
            </xsl:for-each>
        </tr>
    </xsl:template>
</xsl:stylesheet>

Результат, который я хочу:

<table>  
    <tr>  
        <td>1 year</td>  
        <td>17.01062531999216</td>  
        <td>3 years</td>  
        <td>18.01062531999216</td>  
    </tr>  
    <tr>  
        <td>5 years</td>  
        <td>21.01062531999216</td>  
        <td>Since inception</td>  
        <td>12.01062531999216</td>  
    </tr>  
</table>  

Мне стыдноскажи, как долго я работаю над этим.Достаточно сказать, что грубая сила, метод "попробуй все-многократно" не сработал.

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Короче и правильное решение :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="table">
  <table>
   <xsl:apply-templates/>
  </table>
 </xsl:template>
 <xsl:template match="each[position() mod 2 = 1]">
  <tr>
   <xsl:apply-templates select="(.|following-sibling::each[1])/*"/>
  </tr>
 </xsl:template>

 <xsl:template match="name|value">
  <td><xsl:apply-templates/></td>
 </xsl:template>

 <xsl:template match="each[position() mod 2 = 0]"/>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному документу XML:

<data>
    <table id="returns">
        <each>
            <name>1 year</name>
            <value>17.01062531999216</value>
        </each>
        <each>
            <name>3 years</name>
            <value>18.01062531999216</value>
        </each>
        <each>
            <name>5 years</name>
            <value>21.01062531999216</value>
        </each>
        <each>
            <name>Since inception</name>
            <value>12.01062531999216</value>
        </each>
    </table>
</data>

желаемый, правильный результат получается :

<table>
   <tr>
      <td>1 year</td>
      <td>17.01062531999216</td>
      <td>3 years</td>
      <td>18.01062531999216</td>
   </tr>
   <tr>
      <td>5 years</td>
      <td>21.01062531999216</td>
      <td>Since inception</td>
      <td>12.01062531999216</td>
   </tr>
</table>
0 голосов
/ 22 марта 2011

Для рендеринга 2 ячеек в строке.

Выберите каждый второй узел, начиная с первого. Для этого выведите строку, содержащую self и следующую ячейку. Если последняя строка не содержит 2 each элементов, завершите строку пустыми ячейками.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output indent="yes"/>

    <xsl:template match="table">
        <table>
            <xsl:apply-templates select="each[1 = position() mod 2]"/>
        </table>
    </xsl:template>


    <xsl:template match="each">
        <tr>
            <xsl:for-each select=". | following-sibling::each[1]" >
                <td><xsl:value-of select="name"/></td>
                <td><xsl:value-of select="value"/></td>
            </xsl:for-each>
            <xsl:if test="not(following-sibling::each)">
                <td/>
                <td/>
            </xsl:if>
        </tr>
    </xsl:template>

</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...