Dirk Schumacher: unterschiedliche Transformation innerhalb von Elementen

Sorry, dass es sehr konfus ist, aber ich denke man kann das Problem verstehen. Wollt halt viel Quellcode zum genauen verständnis bringen.
Dank im voraus für Hilfe.
Falls es nicht funktionieren kann, dann mailt mir das auch bitte, damit ich ein terminierendes Problem habe :-)

XML-Erklärung:
Ein Beitrag besteht aus einem Abschnitt fuer die Schriftformatierung
und einem Absaetzen.
In einem Absatz steht Text oder es kommen Zeilenumbrueche.
Das Attribut 'BuchstabeEins' in einem Absatz-Tag ist optional.
Wenn es vorhanden ist, dann soll der erste Buchstabe in einem Absatz
um die gegebene Anzahl vergroessert werden:
Wenn also im Element /Beitrag/Format/Schriftgroesse z.B. eine 10 steht und
das Attribut 'BuchstabeEins' eine 5 enthaelt, dann soll der erste Buchstabe
im ersten Wort eines Absatz die Groesse 15 haben bzw. mit einem dargestellt werden.
<span style="font-size:15;">...</span>
-->

Die Ausgabe

<html>
<div style="font-size: 10pt;">
Ein Beitrag<br><hr>Dies ist ein Text im ersten Absatz.<br>Diese Zeile ist in einer neuen Zeile
<hr><span style="font-size:15pt;">D</span>ies ist ein Text im zweiten Absatz.Diese Zeile ist in einer neuen Zeile
<hr>Dies ist ein Text im dritten Absatz.<br>Diese Zeile ist in einer neuen Zeile
</div>
</html>

Jedoch soll die Ausgabe so aussehen, man beachte das jetzt vorhandene <br>-Tag.

<html>
<div style="font-size: 10pt;">
Ein Beitrag<br><hr>Dies ist ein Text im ersten Absatz.<br>Diese Zeile ist in einer neuen Zeile
<hr><span style="font-size:15pt;">D</span>ies ist ein Text im zweiten Absatz.<br>Diese Zeile ist in einer neuen Zeile
<hr>Dies ist ein Text im dritten Absatz.<br>Diese Zeile ist in einer neuen Zeile
</div>
</html>

=======================================
help.dtd

<!ELEMENT Beitrag (Format, Absaetze)>
<!-- hier wird Schriftgroesse definiert -->
<!ELEMENT Format (Schriftgroesse)>
<!ELEMENT Schriftgroesse (#PCDATA)>
<!ATTLIST Schriftgroesse Typ CDATA #REQUIRED>
<!ELEMENT Absaetze (Absatz+)>
<!ELEMENT Absatz (#PCDATA | Return)*>
<!ATTLIST Absatz BuchstabeEins CDATA #IMPLIED>
<!ELEMENT Return EMPTY>

=======================================
help.xml

<?xml version='1.0'?>
<!DOCTYPE Beitrag SYSTEM "help.dtd">
<?xml-stylesheet type="text/xsl" href="help.xsl" ?>

<Beitrag>
<Format>
<Schriftgroesse Typ="pt">10</Schriftgroesse>
</Format>
<Absaetze>
<Absatz>Dies ist ein Text im ersten Absatz.<Return/>Diese Zeile ist in einer neuen Zeile
</Absatz>
<Absatz BuchstabeEins="5">Dies ist ein Text im zweiten Absatz.<Return/>Diese Zeile ist in einer neuen Zeile
</Absatz>
<Absatz>Dies ist ein Text im dritten Absatz.<Return/>Diese Zeile ist in einer neuen Zeile
</Absatz>
</Absaetze>
</Beitrag>

==============================================
help.xsl

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" indent="yes" encoding="ISO-8859-1" omit-xml-declaration="yes" />

<xsl:template match="/">
<html>
<div>
<xsl:attribute name="style">
font-size: <xsl:value-of select="Beitrag/Format/Schriftgroesse" /><xsl:value-of select="Beitrag/Format/Schriftgroesse/@Typ" />;
</xsl:attribute>
Ein Beitrag<br />
<xsl:apply-templates select="Beitrag" />
</div>
</html>
</xsl:template>

<!-- Anzeige der Absaetze -->
<xsl:template match="Beitrag">
<xsl:apply-templates select="Absaetze/Absatz"/>
</xsl:template>

<xsl:template match="Absatz">
<hr />
<xsl:if test="@BuchstabeEins">
<!-- dann mache was ? -->

<!-- den ersten Buchstaben zu separieren koennte so aussehen: -->
<span>
<xsl:attribute name="style">font-size:<xsl:value-of select="number(/Beitrag/Format/Schriftgroesse) + number(@BuchstabeEins)" /><xsl:value-of select="/Beitrag/Format/Schriftgroesse/@Typ" />;</xsl:attribute>
<xsl:value-of select="substring(.,1,1)" />
</span>

<!-- Das ist der Rest auf den <xsl:apply-templates /> fuer <Return /> engewendet werden muss-->
<xsl:value-of select="substring(.,2)" />
</xsl:if>

<xsl:if test="not(@BuchstabeEins)">
<xsl:apply-templates />
</xsl:if>
</xsl:template>

<xsl:template match="Return">
<br />
</xsl:template>

</xsl:stylesheet>

  1. Hallo,

    Jedoch soll die Ausgabe so aussehen, man beachte das jetzt vorhandene <br>-Tag.

    <html>
    <div style="font-size: 10pt;">
    Ein Beitrag<br><hr>Dies ist ein Text im ersten Absatz.<br>Diese Zeile ist in einer neuen Zeile
    <hr><span style="font-size:15pt;">D</span>ies ist ein Text im zweiten Absatz.<br>Diese Zeile ist in einer neuen Zeile
    <hr>Dies ist ein Text im dritten Absatz.<br>Diese Zeile ist in einer neuen Zeile
    </div>
    </html>

    die lösung ist etwas "tricky": (ich habe auch dein html etwas verbesserst und dein xsl umgeschrieben)
    <?xml version="1.0" encoding="iso-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" indent="yes" encoding="ISO-8859-1" omit-xml-declaration="yes" />

    <xsl:template match="/">
    <html>

    <body>

    <xsl:for-each select="Beitrag">
    <div>
    <xsl:attribute name="style">font-size: <xsl:value-of select="Format/Schriftgroesse" /><xsl:value-of select="Format/Schriftgroesse/@Typ" />;</xsl:attribute>
    Ein Beitrag<br />
    <xsl:apply-templates select="Absaetze" />
    </div>
    </xsl:for-each>
    </body>
    </html>
    </xsl:template>

    <!-- Anzeige der Absaetze -->
    <xsl:template match="Absaetze">
    <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="Absatz">
    <hr />
    xsl:choose
       <xsl:when test="@BuchstabeEins">
          <span>
          <xsl:attribute name="style">font-size:<xsl:value-of select="ancestor::Beitrag/Format/Schriftgroesse + @BuchstabeEins" /><xsl:value-of select="ancestor::Beitrag/Format/Schriftgroesse/@Typ" />;</xsl:attribute>
          <xsl:value-of select="substring(.,1,1)" />
          </span>
          <xsl:value-of select="substring(text()[1],2)"/>
          <xsl:apply-templates select="text()[position() != 1] | Return"/>
       </xsl:when>
       xsl:otherwise
          <xsl:apply-templates />
       </xsl:otherwise>
    </xsl:choose>
    </xsl:template>
    <xsl:template match="Return">
    <br />
    </xsl:template>

    </xsl:stylesheet>

    ---------------------

    hoffe es hilft dir weiter

    grüße
    thomas