Announcement

Collapse
No announcement yet.

Template überschreiben und Attribut hinzufügen

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

  • Template überschreiben und Attribut hinzufügen

    Hi,

    ich benutze docbook-xsl-1.75.2/fo und möchte in einem Customization Layer dem Output des <indexterm> Elements weitere Attribute hinzufügen.

    Dazu würde ich gerne das originale <indexterm> Template überschreiben. Das Processing des Original-Templates soll nicht geändert werden, nur dass das erzeugte Element (in diesem Fall entweder ein leeres <fo:block> bzw. <fo:inline> Element) zusätzliche Attribute erhält.

    Geht das irgendwie, mit <xsl:attibute> und <xsl:apply-imports>?

    Dank + Gruss, nE

  • #2
    Ohne jetzt Details des Stylesheet und von XSL-FO zu kennen, halte ich die Ergänzung eines Attributes nicht für möglich, ohne das Template komplett zu überschreiben (also dabei das Element und das dazughörige Attribut im eigenen Template zu erzeugen). Mit HTML und CSS könnte man einfach ein "span" oder "div" mit dem entsprechendem CSS hinzufügen, also wenn das importierte Stylesheet
    Code:
    <xsl:template match="foo">
      <div style="color: red;">
         <xsl:apply-templates/>
      </div>
    </xsl:template>
    hat, dann kann man im importierenden Stylesheet per
    Code:
    <xsl:template match="foo">
      <div style="font-weight: bold;">
        <xsl:apply-imports/>
      </div>
    </xsl:template>
    die Ausgabe von
    Code:
    <div style="font-weight: bold;"> 
      <div style="color: red;">
        ...
      </div>
    </div>
    erreichen. Eventuell macht dieses Vorgehen auch für XSL-FO und inline oder block Sinn, aber ich kenne keinen Weg, nur ein Attribut hinzuzufügen.

    Comment


    • #3
      ja, die Variante den Output des überschriebenen Templates noch mal in ein weiteres Element einzupacken, hatte ich auch schon. Nur leider geht das in diesem Fall nicht, da das einzupackende Element entweder ein Blockelement oder ein Inlineelement sein kann. Also müsste ich vorher wissen, was ich einpacke.

      Das zu überschreibende Template sieht so aus ...

      Code:
      <xsl:template match="indexterm" name="indexterm">
        <!-- Temporal workaround for bug in AXF -->
        <xsl:variable name="wrapper.name">
          <xsl:choose>
            <xsl:when test="$axf.extensions != 0 or $fop1.extensions != 0">
              <xsl:call-template name="inline.or.block"/>
            </xsl:when>
            <xsl:otherwise>fo:wrapper</xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
      
        <xsl:element name="{$wrapper.name}">
          <xsl:attribute name="id">
            <xsl:call-template name="object.id"/>
          </xsl:attribute>
          <xsl:choose>
            <xsl:when test="$xep.extensions != 0">
              <xsl:attribute name="rx:key">
                <xsl:value-of select="&primary;"/>
                <xsl:if test="@significance='preferred'"><xsl:value-of select="$significant.flag"/></xsl:if>
                <xsl:if test="secondary">
                  <xsl:text>, </xsl:text>
                  <xsl:value-of select="&secondary;"/>
                </xsl:if>
                <xsl:if test="tertiary">
                  <xsl:text>, </xsl:text>
                  <xsl:value-of select="&tertiary;"/>
                </xsl:if>
              </xsl:attribute>
            </xsl:when>
            <xsl:otherwise>
              <xsl:comment>
                <xsl:call-template name="comment-escape-string">
                  <xsl:with-param name="string">
                    <xsl:value-of select="primary"/>
                    <xsl:if test="secondary">
                      <xsl:text>, </xsl:text>
                      <xsl:value-of select="secondary"/>
                    </xsl:if>
                    <xsl:if test="tertiary">
                      <xsl:text>, </xsl:text>
                      <xsl:value-of select="tertiary"/>
                    </xsl:if>
                  </xsl:with-param>
                </xsl:call-template>
              </xsl:comment>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:element>
      </xsl:template>
      und erzeugt wird entweder:
      Code:
      ...
      <fo:block id="d72e95">
        <!--foo, bar-->
      </fo:block>
      ...
      .. oder ..

      Code:
      ...
      <fo:inline id="d72e95">
        <!--foo, bar-->
      </fo:inline>
      ...
      Naja, ich denke ich werde das Original-Template einfach duplizieren und alles was ich nicht brauche rauswerfen. Ist zwar nicht schön, aber einfach. Falls ihr einen besseren Vorschlag habt, lasst es mich bitte wissen.

      Comment

      Working...
      X