Hallo,
hab ein Problem mit der Umwandlung von einer flachen xml Struktur in html Listen Elemente ul bzw. li.
Ich hab ein xsl Beispiel im Internet gefunden, dass ich adaptiert habe und das auch funktioniert. Nur leider hab ich jetzt festgestellt, das der Output nicht xhtml transitional konform ist.
Hier ein Beispiel Input:
Das xsl das dies derzeit konvertiert:
Das ist der derzeitige Output:
Dieser ist leider nicht xhtml transitional konform, weil zB das zweite li Element geschlossen wird.
Kann mir jemand sagen, was ich an dem Beispiel andern muss um xhtml transitional Konformität zu erhalten?
Danke.
Halmarius
hab ein Problem mit der Umwandlung von einer flachen xml Struktur in html Listen Elemente ul bzw. li.
Ich hab ein xsl Beispiel im Internet gefunden, dass ich adaptiert habe und das auch funktioniert. Nur leider hab ich jetzt festgestellt, das der Output nicht xhtml transitional konform ist.
Hier ein Beispiel Input:
HTML:
...
<kom>irgend ein text <f>fetter text</f> irgend ein text <k>kursiver text</k></kom>
<kom ty="aufz" eb="1">Das ist der erste Punkt</kom>
<kom ty="aufz" eb="1">Das ist der zweite Punkt</kom>
<kom ty="aufz" eb="2">Das ist der erste Punkt der <f>zweiten</f> Ebene</kom>
<kom ty="aufz" eb="3">Das ist der erste Punkt der <f>dritten</f> Ebene</kom>
<kom ty="aufz" eb="1">Das ist der dritte Punkt</kom>
<kom ty="aufz" eb="1">Das ist der vierte Punkt</kom>
<kom ty="oNr">irgend ein text <f>fetter text</f> irgend ein text <k>kursiver text</k></kom>
...
Das xsl das dies derzeit konvertiert:
HTML:
.....
<xsl:template match="kom">
<xsl:choose>
<xsl:when test="@ty='aufz' or @ty='aufz_num'">
<xsl:apply-templates />
</xsl:when>
<xsl:otherwise>
<p class="content">
<xsl:apply-templates />
</p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
.....
HTML:
<xsl:key name='listitems1_ul' match="kom[@eb='1' and preceding-sibling::kom[1][@eb='1' or @eb='2' or @eb='3'] and @ty='aufz']"
use="generate-id(preceding-sibling::kom[@eb='1'][1])"/>
<xsl:key name='listitems2_ul' match="kom[@eb='2' and preceding-sibling::kom[1][@eb='2' or @eb='3'] and @ty='aufz']"
use="generate-id(preceding-sibling::kom[@eb='2' and preceding-sibling::kom[1][@eb='1']][1])"/>
<xsl:key name='listitems3_ul' match="kom[@eb='3' and preceding-sibling::kom[1][@eb='3'] and @ty='aufz']"
use="generate-id(preceding-sibling::kom[@eb='3' and preceding-sibling::kom[1][@eb='2']][1])"/>
<!--First Items in sublists-->
<xsl:key name='sublistitems2_ul' match="kom[@eb='2' and preceding-sibling::kom[1][@eb='1'] and @ty='aufz']"
use="generate-id(preceding-sibling::kom[@eb='1'][1])"/>
<xsl:key name='sublistitems3_ul' match="kom[@eb='3' and preceding-sibling::kom[1][@eb='2'] and @ty='aufz']"
use="generate-id(preceding-sibling::kom[@eb='2'][1])"/>
<!--Process Level 1 Lists-->
<xsl:template match="kom[@eb='1' and @ty='aufz']" mode="startlist_ul">
<xsl:apply-templates select="." mode="Items_ul"/>
<xsl:apply-templates select="key('sublistitems2_ul', generate-id())"
mode="openlist_ul"/>
<xsl:apply-templates select="key('listitems1_ul', generate-id())"
mode="startlist_ul"/>
</xsl:template>
<!--Process Level 2 Lists-->
<xsl:template match="kom[@eb='2' and @ty='aufz']" mode="startlist_ul">
<xsl:apply-templates select="." mode="Items_ul"/>
<xsl:apply-templates select="key('sublistitems3_ul', generate-id())"
mode="openlist_ul"/>
<xsl:apply-templates select="key('listitems2_ul', generate-id())"
mode="startlist_ul"/>
</xsl:template>
<!--Process Level 3 Lists-->
<xsl:template match="kom[@eb='3' and @ty='aufz']" mode="startlist_ul">
<xsl:apply-templates select="." mode="Items_ul"/>
<xsl:apply-templates select="key('listitems3_ul', generate-id())"
mode="startlist_ul"/>
</xsl:template>
<!--Start a list if the contents is not empty-->
<xsl:template match="kom[(@eb='1' or @eb='2' or @eb='3') and @ty='aufz']" mode="openlist_ul">
<xsl:if test="string(.)!=''">
<ul>
<xsl:if test="@code">
<xsl:attribute name="code"><xsl:value-of select="@code"/></xsl:attribute>
</xsl:if>
<xsl:if test="@type">
<xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="." mode="startlist_ul"/>
</ul>
</xsl:if>
</xsl:template>
<!--Output Individual List Items-->
<xsl:template match="kom[(@eb='1' or @eb='2' or @eb='3') and @ty='aufz']" mode="Items_ul">
<xsl:if test="string(.)!=''">
<li>
<xsl:copy-of select="node()"/>
</li>
</xsl:if>
</xsl:template>
<!--Pick out the first level 1 item in a list, dump other items -->
<xsl:template match="kom[(@eb='1' or @eb='2' or @eb='3') and @ty='aufz']" >
<xsl:if test="@eb='1' and @ty='aufz' and not (preceding-sibling::kom[1][@eb='1' or @eb='2' or @eb='3'])">
<ul>
<xsl:if test="@code">
<xsl:attribute name="code"><xsl:value-of select="@code"/></xsl:attribute>
</xsl:if>
<xsl:if test="@type">
<xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
</xsl:if>
<xsl:apply-templates select="." mode="startlist_ul"/>
</ul>
</xsl:if>
</xsl:template>
.....
Das ist der derzeitige Output:
HTML:
<p class="content">irgend ein text <f>fetter text</f> irgend ein text <k>kursiver text</k></p>
<ul>
<li>Das ist der erste Punkt</li>
<li>Das ist der zweite Punkt</li>
<ul>
<li>Das ist der erste Punkt der <f>zweiten</f> Ebene</li>
<ul>
<li>Das ist der erste Punkt der <f>dritten</f> Ebene</li>
</ul>
</ul>
<li>Das ist der dritte Punkt</li>
<li>Das ist der vierte Punkt</li>
</ul>
<p class="content">irgend ein text <f>fetter text</f> irgend ein text <k>kursiver text</k></p>
Dieser ist leider nicht xhtml transitional konform, weil zB das zweite li Element geschlossen wird.
Kann mir jemand sagen, was ich an dem Beispiel andern muss um xhtml transitional Konformität zu erhalten?
Danke.
Halmarius