Announcement

Collapse
No announcement yet.

XSLT - Attribute dynamisch setzen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XSLT - Attribute dynamisch setzen?

    Hallo,

    ich beschäftige mich gerade mit einer HTML-PDF-Konvertierung mittels FOP. Ich bin da mit Grundlage des IBM-Tutorials rangegangen (http://www.ibm.com/developerworks/library/x-xslfo2app/), habe inzwischen um einiges erweitert und habe jetzt nur noch ein ganz kleines Problem.
    Ich muss dazu sagen, ich bin totaler Anfänger was XSLT angeht. Sorry, wenn das ne ganz blöde Frage ist.

    Wenn ich z.B. den Fall habe, dass in einem "p"-Tag eine Schriftart gewählt wurde und trotzdem ein "font"-Tag existiert, in dem im Html keine Schriftart definiert wurde, dann überschreibe ich die Schriftart aus "p" mit dem Default-Font den ich im "font"-Template setze.

    Das ist natürlich blöd. Daher würde ich am liebsten im "font"-Template keine Default-Schriftart setzen und das Attribut nur setzen, wenn ich tatsächlich einen Wert aus dem HTML ermitteln würde. Allerdings weiß ich nicht, wie man die Attribute dynamisch setzen kann.

    Momentan sieht das "font"-Template so aus
    Code:
    <xsl:template match="font">
            <xsl:variable name="color">
                ...
            </xsl:variable>
            <xsl:variable name="style-font-family"> 
                ...
            </xsl:variable>
            <xsl:variable name="style-background-color"> 
                ...
            </xsl:variable>
            <xsl:variable name="style-font-size"> 
                    ...
            </xsl:variable>
            <fo:inline font-size="{$style-font-size}" font-family="{$style-font-family}" color="{$color}" background-color="{$style-background-color}">
                <xsl:apply-templates select="*|text()" />
            </fo:inline>
        </xsl:template>
    Wenn ich das "font-family"-Attribut einfach leer lasse gibt es eine Exception. Ich hab an anderer Stelle gesehen, dass Attribute nicht in das "fo:inline" mitreingeschrieben wurden, sondern per "xsl:attribute" gesetzt wurden. Ich hab es mal so probiert:

    Code:
    <xsl:template match="font">
            <xsl:variable name="color">
                ...
            </xsl:variable>
            <xsl:variable name="style-font-family"> 
                ...
            </xsl:variable>
            <xsl:variable name="style-background-color"> 
                ...
            </xsl:variable>
            <xsl:variable name="style-font-size"> 
                    ...
            </xsl:variable>
            <xsl:if test="$style-font-family">
                <xsl:attribute name="font-family">
                    <xsl:value-of select="$style-font-family"/> 
                </xsl:attribute>
            </xsl:if>
            <fo:inline font-size="{$style-font-size}" color="{$color}" background-color="{$style-background-color}">
                <xsl:apply-templates select="*|text()" />
            </fo:inline>
    </xsl:template>
    Aber dann bekomme ich diese Meldung:
    Unbekannte SystemId; Zeile #5; Spalte #47; Das Attribut font-family kann nicht nach untergeordneten Elementen oder vor der Erstellung eines Elements hinzugefügt werden. Das Attribut wird ignoriert.

    Das muss doch irgendwie gehen. Kann mir jemand einen Tipp geben?

    Viele Grüße,
    Sina

  • #2
    Du musst erst ein Element erzeugen, dann "darin" eventuelle Attribute:
    Code:
    <fo:inline ...>
      <xsl:if test="$style-font-family">
        <xsl:attribute name="font-family"
          <xsl:value-of select="$style-font-family"/>
        </xsl:attribute>
      </xsl:if>
      <xsl:apply-templates/>
    </fo:inline>
    Zuletzt editiert von Martin Honnen; 19.11.2010, 18:13.

    Comment


    • #3
      Danke schön. So geht's.

      Comment

      Working...
      X