Portál AbcLinuxu, 16. července 2025 04:02


Dotaz: jak dam vedle sebe v xslt dva ruzne dlouhe sloupce z ruznych zdroju, aby se kratsi dorovnal prazdnyma bunkama

28.11.2013 07:52 jeleniste | skóre: 13 | blog: Prokustovo lože
jak dam vedle sebe v xslt dva ruzne dlouhe sloupce z ruznych zdroju, aby se kratsi dorovnal prazdnyma bunkama
Přečteno: 505×
Odpovědět | Admin
Mam dotaz Delam nejake vypisy z db do html. Z db generuju xml a ve vypisu potrebuju mit vedle sebe vypsane v jedne html tabulce dva ruzne dotazy do db, ktere obvykle vraci kazdy jiny pocet radku. Jak udělám v xslt, abych měl na konci dorovnanej ten kratší prázdnejma buňkama (nebo jednou s colspan="0"?
Teď to řešim v sql, že to zjoinuju a už mi to tam ty prázdný buňky vrací, ale to neni moc čistý řešení, chtěl bych do db šahat jen pro data a strukturu řešit komplet v xslt (který žel bohu moc neumim, co nevygůgluju nemam). Dá se to nějak elegantně udělat? Díky Je;
Nejsem blbý, jen se hloupě ptám

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (jeleniste (tazatel))
28.11.2013 08:31 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: jak dam vedle sebe v xslt dva ruzne dlouhe sloupce z ruznych zdroju, aby se kratsi dorovnal prazdnyma bunkama
Odpovědět | | Sbalit | Link | Blokovat | Admin
Předpokládám, že vstup má +- takovouhle formu:
<?xml version="1.0"?>
<data>
 <a>
  <item>Alpha</item>
  <item>Bravo</item>
  <item>Charlie</item>
 </a>
 <b>
  <item>Zulu</item>
 </b>
</data>
Pak následující dorovná buňky pomlčkama.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" indent="yes" />

<xsl:template match="/">
    <html>
        <head><title>Title</title></head>
        <body>
            <xsl:apply-templates select="data" />
        </body>
    </html>
</xsl:template>

<xsl:template match="data">
<xsl:variable name="THIS" select="." />
<xsl:variable name="BOTH" select="a/item | b/item" />
<table border="1">
    <xsl:for-each select="$BOTH[(position() &lt;= count($THIS/a/item)) or (position() &lt;= count($THIS/b/item))]">
        <xsl:variable name="INDEX" select="position()" />
        <tr>
            <td>
                <xsl:value-of select="$INDEX" />
            </td>
            <td>
                <xsl:choose>
                    <xsl:when test="$INDEX &lt;= count($THIS/a/item)">
                        <xsl:apply-templates select="$THIS/a/item[$INDEX]" />
                    </xsl:when>
                    <xsl:otherwise>
                        -
                    </xsl:otherwise>
                </xsl:choose>
            </td>
            <td>
                <xsl:choose>
                    <xsl:when test="$INDEX &lt;= count($THIS/b/item)">
                        <xsl:apply-templates select="$THIS/b/item[$INDEX]" />
                    </xsl:when>
                    <xsl:otherwise>
                        -
                    </xsl:otherwise>
                </xsl:choose>
            </td>
        </tr>
    </xsl:for-each>
</table>
</xsl:template>

<xsl:template match="item">
    <b><xsl:value-of select="." /></b>
</xsl:template>

</xsl:stylesheet>

Trik je v tom, že se vyberou oba dva uzly pro for-each iteraci a v každém průchodu se kontroluje, jestli tam takový prvek je.

Ale nevím, jak to bude rychlé pro větší data.

I am always ready to learn although I do not always like to be taught. (W. Churchill)
28.11.2013 09:11 jeleniste | skóre: 13 | blog: Prokustovo lože
Rozbalit Rozbalit vše Re: jak dam vedle sebe v xslt dva ruzne dlouhe sloupce z ruznych zdroju, aby se kratsi dorovnal prazdnyma bunkama
Supr, to je ono. Díky moc.
Nejsem blbý, jen se hloupě ptám

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.