whine: Element in Kopfzeile

Hallo zusammen,

ich habe folgende XML

<PUBLICATION>  
  <SECTION_LIST>  
    <SECTION>  
        <NAME>Dänemark</NAME>  
	  <PRODUCT_LIST>  
            <PRODUCT>  
              <NUMBER>1</NUMBER>  
			</PRODUCT>  
			 <PRODUCT>  
              <NUMBER>2</NUMBER>  
			</PRODUCT>  
			 <PRODUCT>  
              <NUMBER>3</NUMBER>  
	     </PRODUCT>  
			...  
	 </PRODUCT_LIST>  
    </SECTION>		  
    <SECTION>  
        <NAME>Deutschland</NAME>  
	 <PRODUCT_LIST>  
            <PRODUCT>  
              <NUMBER>4</NUMBER>  
			</PRODUCT>  
			 <PRODUCT>  
              <NUMBER>5</NUMBER>  
			</PRODUCT>  
			 <PRODUCT>  
              <NUMBER>6</NUMBER>  
	    </PRODUCT>  
			...  
	 </PRODUCT_LIST>  
    </SECTION>	  
...  
</SECTION_LIST>	  
<PUBLICATION>

Ich versuche mittels xslt (FO) den Inhalt in pdf-Seiten zu kriegen (klappt soweit, den ganzen Tabellenkram habe ich mal hier weggelassen). Nur mit der Kopfzeile hapert es. Wenn ich folgende xslt loslasse, wird mir "Dänemark" brav in die Kopfzeile geschrieben, aber leider immer. Also auch wenn die Daten der nächsten SECTION geschrieben werden, steht in der Kopfzeile immer noch der Name der ersten SECTION. Hat jemand eine Idee?

  
<xsl:template match="PUBLICATION">  
    <fo:root>  
      <fo:layout-master-set>  
		...  
        <fo:static-content flow-name="xsl-region-before">  
		<!-- Kopfzeile -->  
		<xsl:value-of select="//NAME"/>  
		...  
        <fo:flow flow-name="xsl-region-body">  
		...		  
	<xsl:apply-templates/>					  
       ...  
</xsl:template>  
  
<xsl:template match="PRODUCT">	  
       <xsl:value-of select="NUMBER"/>  
</xsl:template> 

whine

  1. Hallo whine,

    Ich versuche mittels xslt (FO) den Inhalt in pdf-Seiten zu kriegen (klappt soweit, den ganzen Tabellenkram habe ich mal hier weggelassen). Nur mit der Kopfzeile hapert es. Wenn ich folgende xslt loslasse, wird mir "Dänemark" brav in die Kopfzeile geschrieben, aber leider immer. Also auch wenn die Daten der nächsten SECTION geschrieben werden, steht in der Kopfzeile immer noch der Name der ersten SECTION. Hat jemand eine Idee?

    Schreibe den fo:static-content (mit variablen Textteilen) nicht ins fo:layout-master-set, sondern innerhalb der darauf referenzierenden fo:page-sequence (sinnvoll wäre als Kopfbereich die fo:region-before).

    Dann lässt sich auch direkt auf "NAME" selektieren, dass immer "Dänemark" erscheint liegt an der Referenz auf "//NAME". Ohne xsl:apply-templates oder xsl:for-each wird jeweils nur das erste Mitglied der Knotenliste ausgegeben, zumindest unter XSLT 1.0. Bei Verwendung von XSLT 2.0 würden dort alle Ländernamen auftauchen.

    Grüße,
    Thomas

    1. Hallo Thomas,

      ich habe etwas Code weggelassen. Meine Kopfzeile steht in

        
      <fo:layout-master-set>  
              <fo:simple-page-master  master-name="Standardseite"  
                    page-height="297mm" page-width="210mm" margin-top="8mm" margin-left="20mm" margin-bottom="24mm" margin-right="7mm">  
                <fo:region-body margin-top="22mm" margin-left="0mm" margin-bottom="20mm" margin-right="0mm"/>  
                <fo:region-before extent="20mm"/>  
                <fo:region-after extent="20mm"/>  
              </fo:simple-page-master>  
            </fo:layout-master-set>  
            <fo:page-sequence master-reference="Standardseite" initial-page-number="20">  
              <fo:static-content flow-name="xsl-region-before">  
                <fo:block>  
      		<!-- Kopfzeile -->  
      		...<xsl:value-of select="//NAME"/>... 	
      

      Du meinst, ich müsste also in der Kopfzeile z.B. ein for-each einbauen

      <xsl:for-each select="SECTION">  
      	<xsl:value-of select="NAME"/>  
      </xsl:for-each>
      

      Leider steht dann nix in der Kopfzeile.

      whine

      1. Hallo whine,

        Du meinst, ich müsste also in der Kopfzeile z.B. ein for-each einbauen

        <xsl:for-each select="SECTION">

        <xsl:value-of select="NAME"/>
        </xsl:for-each>

        
        >   
        > Leider steht dann nix in der Kopfzeile.  
          
        Überblicke ich so nicht. Praktikabel könnte ein separates benanntes Template sein, welches via xsl:call-template im Kopfbereich aufgerufen wird.  
          
        Poste mal ein minimales testbares XML-Dokument und die gewünschte Ausgabe.  
          
        Grüße,  
        Thomas
        
        1. Poste mal ein minimales testbares XML-Dokument und die gewünschte Ausgabe.

          Guten Morgen Thomas,

          also ein abgespecktes XML-Dokument wäre

          <?xml version="1.0" encoding="UTF-8"?>  
          <PUBLICATION xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="305700.xsd">  
            <SECTION_LIST>  
              <SECTION>  
                  <NAME>Dänemark</NAME>  
                    <PRODUCT_LIST>  
                      <PRODUCT>  
                        <NUMBER>1</NUMBER>  
                      </PRODUCT>  
                      <PRODUCT>  
                        <NUMBER>2</NUMBER>  
                      </PRODUCT>  
                      <PRODUCT>  
                         <NUMBER>3</NUMBER>  
                       </PRODUCT>  
                   </PRODUCT_LIST>  
              </SECTION>  
              <SECTION>  
                  <NAME>Deutschland</NAME>  
                   <PRODUCT_LIST>  
                      <PRODUCT>  
                        <NUMBER>4</NUMBER>  
                       </PRODUCT>  
                       <PRODUCT>  
                        <NUMBER>5</NUMBER>  
                       </PRODUCT>  
                       <PRODUCT>  
                        <NUMBER>6</NUMBER>  
                      </PRODUCT>  
                   </PRODUCT_LIST>  
              </SECTION>  
              <SECTION>  
                  <NAME>Schweden</NAME>  
                   <PRODUCT_LIST>  
                      <PRODUCT>  
                        <NUMBER>7</NUMBER>  
                       </PRODUCT>  
                       <PRODUCT>  
                        <NUMBER>8</NUMBER>  
                       </PRODUCT>  
                       <PRODUCT>  
                        <NUMBER>9</NUMBER>  
                      </PRODUCT>  
                      <PRODUCT>  
                        <NUMBER>10</NUMBER>  
                      </PRODUCT>  
                   </PRODUCT_LIST>  
              </SECTION>   	  
          </SECTION_LIST>  
          <PUBLICATION>
          

          Die Ausgabe sollte in etwa so aussehen

          S.1    Deutschland <!-- Kopfzeile -->
          ------------------
          Nummer 1
          Nummer 2
          Nummer 3

          --Seitenumbruch--
          S.2     Dänemark
          ---------------
          Nummer 4
          Nummer 5
          Nummer 6

          --Seitenumbruch--

          S.3     Schweden
          Nummer 7
          Nummer 8
          Nummer 9
          Nummer 10

          whine

          1. Hallo whine,

            Die Ausgabe sollte in etwa so aussehen

            Probiere es so:

            <?xml version="1.0" encoding="UTF-8"?>  
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
              xmlns:fo="http://www.w3.org/1999/XSL/Format">  
              
              <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>  
              
              <xsl:template match="PUBLICATION/SECTION_LIST">  
                <fo:root font-family="Arial, Helvetica, sans-serif">  
              
                  <fo:layout-master-set>  
                    <fo:simple-page-master master-name="Standardseite"  
                      page-height="297mm" page-width="210mm" margin-top="8mm" margin-left="20mm" margin-bottom="24mm" margin-right="7mm">  
                      <fo:region-body margin-top="22mm" margin-left="0mm" margin-bottom="20mm" margin-right="0mm"/>  
                      <fo:region-before extent="20mm"/>  
                      <fo:region-after extent="20mm"/>  
                    </fo:simple-page-master>  
                  </fo:layout-master-set>  
              
                  <fo:page-sequence master-reference="Standardseite">  
                    <fo:static-content flow-name="xsl-region-before">  
                      <fo:block color="#00F" background-color="#FFC">  
                        <fo:retrieve-marker retrieve-class-name="kopfzeile" retrieve-boundary="page-sequence"/>  
                      </fo:block>  
                    </fo:static-content>  
                    <fo:static-content flow-name="xsl-region-after">  
                      <fo:block>Inhalt …</fo:block>  
                    </fo:static-content>  
                    <fo:flow flow-name="xsl-region-body">  
                      <xsl:apply-templates select="SECTION"/>  
                    </fo:flow>  
                  </fo:page-sequence>  
              
                </fo:root>  
              </xsl:template>  
              
              <xsl:template match="SECTION">  
                <fo:block break-before="page">  
                  <fo:marker marker-class-name="kopfzeile">  
                    <xsl:value-of select="concat('S. ', position(), ' ',NAME)"/>  
                  </fo:marker>  
                  <xsl:apply-templates select="PRODUCT_LIST/PRODUCT"/>  
                </fo:block>  
              
              </xsl:template>  
              
              <xsl:template match="PRODUCT">  
                <fo:block><xsl:value-of select="concat('Nummer ', NUMBER)"/></fo:block>  
              </xsl:template>  
              
            </xsl:stylesheet>
            

            Grüße,
            Thomas

            1. Grandios!
              Nach etwas Anpassung im style macht es^^ genau, was es will :)
              Vielen, vielen Dank!

              whine

  2. Hallo,

    für dynamische Kopfzeilen bietet sich dieser Aufbau an:

    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">  
    	<fo:page-sequence master-reference="main-page">  
    		 <!-- Start Static Header ================================================================================================================ -->  
    		 <fo:static-content flow-name="xsl-region-before">  
    			  <fo:retrieve-marker retrieve-class-name="page-head"/>  
    		 </fo:static-content>  
    		 <!-- Start Body ================================================================================================================ -->  
    		 <fo:flow flow-name="xsl-region-body">  
    			<xsl:for-each select="/root/irgendwas">  
    				<!-- Start Dynamic Header ========================================================================================================= -->  
    				<fo:block>  
    					 <fo:marker marker-class-name="page-head">  
    							<!-- Dynamischer Inhalt -->  
    					 </fo:marker>  
    				</fo:block>  
    				  
    			</xsl:for-each>					  
    		</fo:flow>  
    		 <!-- End Body =================================================================================================================== -->  
    	</fo:page-sequence>  
    </fo:root>
    

    Viele Grüße
    Siri