XSLT - создание ряда столбцов и строк из набора данных -

0

Я очень новичок в XSL, и я оказался в этой проблеме.

У меня есть этот XML:

<?xml version="1.0"?>
<OrdenPP10>
    <Puente>
        <FOL_LIQ>43110847</FOL_LIQ>
        <FOLIO_PISA>014050869</FOLIO_PISA>
        <TIPO_TAREA>TV1LPBD</TIPO_TAREA>
        <TELEFONO>0015177534</TELEFONO>
        <DISPOSITIVO>31000039178</DISPOSITIVO>
        <PDG>39D010</PDG>
        <ID_CABLE>IT_0452</ID_CABLE>
        <PAR>21</PAR>
        <ID_CABLE2>IT_0160H3</ID_CABLE2>
        <PAR2>8</PAR2>
        <DSLAM>MXIZ19</DSLAM>
        <REMATE_ENT>IT_65K145</REMATE_ENT>
        <REMATE_SAL>IT_65L145</REMATE_SAL>
        <GRUPO_ADSL>IT_17249</GRUPO_ADSL>
        <WRSTAT>ASSIGN</WRSTAT>
        <WIRECENTER>IT_</WIRECENTER>
    </Puente>
    <Puente>
        <FOL_LIQ>43107691</FOL_LIQ>
        <FOLIO_PISA>014052710</FOLIO_PISA>
        <TIPO_TAREA>TV1LPBD</TIPO_TAREA>
        <TELEFONO>0054213416</TELEFONO>
        <DISPOSITIVO>31000043242</DISPOSITIVO>
        <PDG>43C106</PDG>
        <ID_CABLE>IT_0299</ID_CABLE>
        <PAR>39</PAR>
        <ID_CABLE2>IT_0084F4</ID_CABLE2>
        <PAR2>6</PAR2>
        <DSLAM>ME19</DSLAM>
        <REMATE_ENT>IT_65K151</REMATE_ENT>
        <REMATE_SAL>IT_65L151</REMATE_SAL>
        <GRUPO_ADSL>IT_17255</GRUPO_ADSL>
        <WRSTAT>ASSIGN</WRSTAT>
        <WIRECENTER>IT_</WIRECENTER>
    </Puente>
    <Puente>
        <FOL_LIQ>43107685</FOL_LIQ>
        <FOLIO_PISA>014052644</FOLIO_PISA>
        <TIPO_TAREA>TV1LPBD</TIPO_TAREA>
        <TELEFONO>5556101551</TELEFONO>
        <DISPOSITIVO>31000032271</DISPOSITIVO>
        <PDG>32F015</PDG>
        <ID_CABLE>IT_0134A</ID_CABLE>
        <PAR>25</PAR>
        <ID_CABLE2>IT_0056M2</ID_CABLE2>
        <PAR2>9</PAR2>
        <DSLAM>MXIZ93</DSLAM>
        <REMATE_ENT>IT_11Q077</REMATE_ENT>
        <REMATE_SAL>IT_11R077</REMATE_SAL>
        <GRUPO_ADSL>IT_03613</GRUPO_ADSL>
        <WRSTAT>ASSIGN</WRSTAT>
        <WIRECENTER>IT_</WIRECENTER>
    </Puente>
</OrdenPP10>

и этот незавершенный XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="filas" select="ceiling(count(//Puente) div 7)"></xsl:variable>

    <xsl:template match="/">
        <html>
        <head>
            <style type="text/css">
                .primerdiv{
                    clear:left;
                    float:left;
                }

                .borde{
                    border: 1px solid black;
                }

                .letra{
                    font-family:Arial;
                    font-size:7pt;
                }
                .lbold{
                    font-family:Arial;
                    font-size:7pt;
                    font-weight: bold;
                }

                .paddingptes{
                    padding: 2px 2px 2px 2px;
                    text-align:left;    
                    height: 20px;
                    width: 100%;
                    vertical-align:center;

                }
                .altbordeptes{
                    border-right:1px solid black;
                }

            </style>
        </head>
        <body>
            <div class="borde">
                <div class="lbold" style="width: 99%">
                    <div style="float:left; align:center; width:32%">&nbsp;</div>
                    <div style="float:left; text-align:center; vertical-align:top; width:32%">HEADER
                        <br/>BLAH
                        <br/>BLAH BLAH
                        <br/><hr/>
                    </div>

                    <div class="lbold empltitulo" style="float:left; text-align:right; vertical-align:top; width:35%;">FECHA: <xsl:value-of select="$para-font-size"/></div>
                    <div class="primerdiv letra" style="width:10%" >TECNICO:  </div>
                    <div class="letra" style="float:left; width:79.9%">&nbsp;</div>
                    <div class="letra" style="float:left; width:10%">COPE: </div>
                    <div class="primerdiv" style="width:99%;"><hr/></div>
                </div>

                <div class="primerdiv altbordeptes" style="width:12.3%; border-left: 1px solid black;">
                    <div class="primerdiv">
                        <div class="primerdiv lbold paddingptes">
                            F PISAPLEX:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            FOLIO PISA:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            TIPO TAREA:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            TELEFONO:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            DISPOSITIVO:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            PDG:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            ID CABLE:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            PAR:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            DSLAM:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            REMATE ENT.:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            REMATE SAL.:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            GRUPO ADSL:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            R ENT VID:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            R SAL VID:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            DSLAM ORIGEN:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            R ENT ORIGEN:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            R SAL ORIGEN:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            DSLAM DESTINO:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            R ENT DESTINO:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            R SAL DESTINO:
                        </div>
                        <div class="primerdiv lbold paddingptes">
                            ANCHO BANDA:
                        </div>
                    </div>
                </div>
            <xsl:for-each select="OrdenPP10/Puente">
                <div class="altbordeptes" style="float:left; width:12.3%;">
                    <div class="primerdiv">
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="FOL_LIQ"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="FOLIO_PISA"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="TIPO_TAREA"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="TELEFONO"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="DISPOSITIVO"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="PDG"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="ID_CABLE"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="PAR"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="DSLAM"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="REMATE_ENT"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="REMATE_SAL"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="GRUPO_ADSL"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="REntVid"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="RSalVid"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="DSLAMOrig"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="REntOrigen"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="RSalOrigen"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="DSLAMDestino"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="REntDestino"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="RSalDestino"/>
                        </div>
                        <div class="primerdiv letra paddingptes">
                            <xsl:value-of select="AnchoBanda"/>
                        </div>
                    </div>
                </div>

            </xsl:for-each>

            <div style="clear:left;" width=100%>
                <hr />
            </div>
        </body>
        </html>
    </xsl:template>
 </xsl:stylesheet>

Дело до сих пор довольно просто: с каждым из них я могу проанализировать XML, чтобы получить все данные в столбцы и превратить файл в несколько аккуратный HTML. Но проблема в том, что я могу получить XML с 1 Puente, 3, 20, 40 или 80.

Итак, вот вопрос: есть ли способ отформатировать этот XSL, чтобы получить не более 7 Puente by div и отдохнуть в другом div (s) ниже, учитывая, что первый div должен быть тем, у кого есть заголовки?

Я делал то же самое в коде С# (с обычными таблицами HTML) много времени назад, и это было очень просто (используя mod и т.п., Чтобы сделать tr s и td s), и хотя у меня уже есть количество требуемые строки (по функции в верхней части XSL), я до сих пор не знаю, как создавать динамические строки и не использовать, опять же, для каждого.

Это звучит как работа. Но вся документация, которую я мог найти, была для вышеупомянутого для каждого. Если бы вы могли направить меня к решению, было бы очень приятно.

Пожалуйста, помните, что я новичок. Клянусь, я много читал об этом, но не нашел (число) решений (я), к которым я могу обратиться.

Заранее спасибо, Тонио.

Теги:
for-loop
xslt

1 ответ

0
Лучший ответ

Начните новую "таблицу" для каждого Puente[position() mod 7 = 1] и создайте "строки" для . | following-sibling::Puente[position() &lt; 7] . | following-sibling::Puente[position() &lt; 7] . | following-sibling::Puente[position() &lt; 7] (то есть я и следующие 6 братьев и сестер).


Редактировать:

Вот простой пример. Использование минимального ввода и результата таблицы:

<OrdenPP10>
    <Puente>
        <FOL_LIQ>001</FOL_LIQ>
        <FOLIO_PISA>014050869</FOLIO_PISA>
    </Puente>
    <Puente>
        <FOL_LIQ>002</FOL_LIQ>
        <FOLIO_PISA>014052710</FOLIO_PISA>
    </Puente>
    <Puente>
        <FOL_LIQ>003</FOL_LIQ>
        <FOLIO_PISA>014052644</FOLIO_PISA>
    </Puente>
    <Puente>
        <FOL_LIQ>004</FOL_LIQ>
        <FOLIO_PISA>014050869</FOLIO_PISA>
    </Puente>
    <Puente>
        <FOL_LIQ>005</FOL_LIQ>
        <FOLIO_PISA>014052710</FOLIO_PISA>
    </Puente>
    <Puente>
        <FOL_LIQ>006</FOL_LIQ>
        <FOLIO_PISA>014052644</FOLIO_PISA>
    </Puente>
    <Puente>
        <FOL_LIQ>007</FOL_LIQ>
        <FOLIO_PISA>014050869</FOLIO_PISA>
    </Puente>
    <Puente>
        <FOL_LIQ>008</FOL_LIQ>
        <FOLIO_PISA>014052710</FOLIO_PISA>
    </Puente>
    <Puente>
        <FOL_LIQ>009</FOL_LIQ>
        <FOLIO_PISA>014052644</FOLIO_PISA>
    </Puente>
</OrdenPP10>

Применение следующей таблицы стилей:

XSLT 1.0

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

<xsl:template match="/OrdenPP10">
    <table border="1">
        <xsl:for-each select="Puente[position() mod 7 = 1]" >
            <thead>
                <tr>
                    <th>Title</th>
                    <th>Text</th>
                </tr>
            </thead>
            <tbody>
                <xsl:apply-templates select=". | following-sibling::Puente[position() &lt; 7]"/>
            </tbody>
        </xsl:for-each>
    </table>
</xsl:template>

<xsl:template match="Puente">
    <tr>
        <td><xsl:value-of select="FOL_LIQ"/></td>
        <td><xsl:value-of select="FOLIO_PISA"/></td>
    </tr>
</xsl:template>

</xsl:stylesheet>

приведет к:

<?xml version="1.0" encoding="UTF-8"?>
<table border="1">
   <thead>
      <tr>
         <th>Title</th>
         <th>Text</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>001</td>
         <td>014050869</td>
      </tr>
      <tr>
         <td>002</td>
         <td>014052710</td>
      </tr>
      <tr>
         <td>003</td>
         <td>014052644</td>
      </tr>
      <tr>
         <td>004</td>
         <td>014050869</td>
      </tr>
      <tr>
         <td>005</td>
         <td>014052710</td>
      </tr>
      <tr>
         <td>006</td>
         <td>014052644</td>
      </tr>
      <tr>
         <td>007</td>
         <td>014050869</td>
      </tr>
   </tbody>
   <thead>
      <tr>
         <th>Title</th>
         <th>Text</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>008</td>
         <td>014052710</td>
      </tr>
      <tr>
         <td>009</td>
         <td>014052644</td>
      </tr>
   </tbody>
</table>

отображается как:

Изображение 174551


Изменить 2:

Я больше пыталась переставить таблицу.

То же самое, возможно, даже проще:

XSLT 1.0

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

<xsl:template match="/OrdenPP10">
    <table border="1">
        <xsl:for-each select="Puente[position() mod 7 = 1]" >
            <tr>
                <th>Title<br/>Text</th>
                <xsl:apply-templates select=". | following-sibling::Puente[position() &lt; 7]"/>
            </tr>
        </xsl:for-each>
    </table>
</xsl:template>

<xsl:template match="Puente">
    <td>
        <xsl:value-of select="FOL_LIQ"/>
        <br/>
        <xsl:value-of select="FOLIO_PISA"/>
    </td>
</xsl:template>

</xsl:stylesheet>

Результат:

Изображение 174551

  • 0
    Спасибо! Но как мне пройти через это? что-то вроде <xsl:for-each select="OrdenPP10/Puente"> <xsl:choose> <xsl:when Puente[position() mod 7 = 1]> <!--new row--> </xsl:when> <xsl:otherwise> <!-- keep doing while .|following-sibling::Puente[position() &lt; 7] --> </xsl:otherwise> </xsl:choose> </xsl:for-each> ?
  • 0
    @ ToñoPérez Смотрите изменения в моем сообщении.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню