Announcement

Collapse
No announcement yet.

Selektionsproblem

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

  • Selektionsproblem

    Hallo, ich habe da ein Selektionsproblem. Ich will alle Legendenpunkte (descriptivebodygraphiclegend), die direkt nach dem 1. Bild "descriptivebodygraphicfigure" kommen, selektieren und ausgeben.
    Und dann wieder alle Legendenpunkte, die direkt nach dem 2. Bild kommen selektieren und ausgeben.


    Ich habe folgendes XML-Ausgangsdokument (Auszug daraus).

    Code:
    <w:p w:rsidR="009D0CAA" w:rsidRDefault="00A870ED" w:rsidP="009D0CAA">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphicfigure"/>
    			</w:pPr>
    			<w:r>
    				<w:rPr>
    					<w:noProof/>
    					<w:lang w:eastAsia="de-DE" w:bidi="th-TH"/>
    				</w:rPr>
    				<w:drawing>
    					<wp:inline distT="0" distB="0" distL="0" distR="0">
    						<wp:extent cx="1820883" cy="1365662"/>
    						<wp:effectExtent l="19050" t="0" r="7917" b="0"/>
    						<wp:docPr id="2" name="Grafik 1" descr="Winter.jpg"/>
    						<wp:cNvGraphicFramePr>
    							<a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/>
    						</wp:cNvGraphicFramePr>
    						<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
    							<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
    								<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
    									<pic:nvPicPr>
    										<pic:cNvPr id="0" name="Winter.jpg"/>
    										<pic:cNvPicPr/>
    									</pic:nvPicPr>
    									<pic:blipFill>
    										<a:blip r:embed="rId8" cstate="print"/>
    										<a:stretch>
    											<a:fillRect/>
    										</a:stretch>
    									</pic:blipFill>
    									<pic:spPr>
    										<a:xfrm>
    											<a:off x="0" y="0"/>
    											<a:ext cx="1820008" cy="1365005"/>
    										</a:xfrm>
    										<a:prstGeom prst="rect">
    											<a:avLst/>
    										</a:prstGeom>
    									</pic:spPr>
    								</pic:pic>
    							</a:graphicData>
    						</a:graphic>
    					</wp:inline>
    				</w:drawing>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="009D0CAA" w:rsidRDefault="00A870ED" w:rsidP="00A870ED">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphiccaption"/>
    			</w:pPr>
    			<w:r>
    				<w:t>Eine Bildbeschriftung fürs 1. Bild!</w:t>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="005A5E34" w:rsidRDefault="005A5E34" w:rsidP="005A5E34">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphiclegend"/>
    			</w:pPr>
    			<w:r w:rsidRPr="005A5E34">
    				<w:t>1.</w:t>
    			</w:r>
    			<w:r>
    				<w:t xml:space="preserve"> Legendentext 1. Bild</w:t>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="005A5E34" w:rsidRDefault="005A5E34" w:rsidP="005A5E34">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphiclegend"/>
    			</w:pPr>
    			<w:r>
    				<w:t>2. Legendentext 1. Bild</w:t>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="005A5E34" w:rsidRPr="005A5E34" w:rsidRDefault="005A5E34" w:rsidP="005A5E34">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphiclegend"/>
    			</w:pPr>
    			<w:r>
    				<w:t>3. Legendentext 1. Bild</w:t>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="007B1E78" w:rsidRDefault="007B1E78" w:rsidP="007B1E78">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodyparagraph"/>
    			</w:pPr>
    			<w:r>
    				<w:t>HAUPTTEXT2!!!</w:t>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="005A5E34" w:rsidRDefault="005A5E34" w:rsidP="007B1E78">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodyparagraph"/>
    			</w:pPr>
    			<w:r>
    				<w:t>HAUPTTEXT3</w:t>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="005A5E34" w:rsidRDefault="005A5E34" w:rsidP="005A5E34">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphicfigure"/>
    			</w:pPr>
    			<w:r>
    				<w:rPr>
    					<w:noProof/>
    					<w:lang w:eastAsia="de-DE" w:bidi="th-TH"/>
    				</w:rPr>
    				<w:drawing>
    					<wp:inline distT="0" distB="0" distL="0" distR="0">
    						<wp:extent cx="2438400" cy="1828800"/>
    						<wp:effectExtent l="19050" t="0" r="0" b="0"/>
    						<wp:docPr id="3" name="Grafik 2" descr="Blaue Berge.jpg"/>
    						<wp:cNvGraphicFramePr>
    							<a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/>
    						</wp:cNvGraphicFramePr>
    						<a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
    							<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
    								<pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
    									<pic:nvPicPr>
    										<pic:cNvPr id="0" name="Blaue Berge.jpg"/>
    										<pic:cNvPicPr/>
    									</pic:nvPicPr>
    									<pic:blipFill>
    										<a:blip r:embed="rId9" cstate="print"/>
    										<a:stretch>
    											<a:fillRect/>
    										</a:stretch>
    									</pic:blipFill>
    									<pic:spPr>
    										<a:xfrm>
    											<a:off x="0" y="0"/>
    											<a:ext cx="2438400" cy="1828800"/>
    										</a:xfrm>
    										<a:prstGeom prst="rect">
    											<a:avLst/>
    										</a:prstGeom>
    									</pic:spPr>
    								</pic:pic>
    							</a:graphicData>
    						</a:graphic>
    					</wp:inline>
    				</w:drawing>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="005A5E34" w:rsidRDefault="005A5E34" w:rsidP="005A5E34">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphiccaption"/>
    			</w:pPr>
    			<w:r>
    				<w:t>Eine Bildunterschrift</w:t>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="005A5E34" w:rsidRDefault="005A5E34" w:rsidP="005A5E34">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphiclegend"/>
    			</w:pPr>
    			<w:r w:rsidRPr="005A5E34">
    				<w:t>1.</w:t>
    			</w:r>
    			<w:r>
    				<w:t xml:space="preserve"> Legendentext 2. Bild</w:t>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="005A5E34" w:rsidRDefault="005A5E34" w:rsidP="005A5E34">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphiclegend"/>
    			</w:pPr>
    			<w:r>
    				<w:t>2. Legendentext 2. Bild</w:t>
    			</w:r>
    		</w:p>
    		<w:p w:rsidR="005A5E34" w:rsidRPr="005A5E34" w:rsidRDefault="005A5E34" w:rsidP="005A5E34">
    			<w:pPr>
    				<w:pStyle w:val="descriptivebodygraphiclegend"/>
    			</w:pPr>
    			<w:r>
    				<w:t xml:space="preserve">3. Legendentext </w:t>
    			</w:r>
    			<w:r w:rsidR="00444416">
    				<w:t>2</w:t>
    			</w:r>
    			<w:r>
    				<w:t xml:space="preserve">. Bild </w:t>
    			</w:r>
    		</w:p>

    Mein XSL-Stylesheet:


    Code:
    <xsl:template match="w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphicfigure']]">
      
      <xsl:variable name="graphicname" select="w:r/w:drawing/wp:inline/wp:docPr/@descr"/>
      
      <graphic graphwidth="other">
      <figure>
      <xsl:attribute name="graphicname"><xsl:value-of select="w:r/w:drawing/wp:inline/wp:docPr/@descr"/></xsl:attribute>
      </figure>
      <xsl:if test="following-sibling::w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphiccaption']][1]">
      <caption>
      <xsl:apply-templates select="following-sibling::w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphiccaption']][1]/w:r" />
       </caption>
      </xsl:if>
      <xsl:if test="following-sibling::w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphiclegend']]">
      <legend>
    
      <xsl:for-each select="following-sibling::w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphiclegend']]">
    
    
      <legenditem>  
      <xsl:apply-templates select="w:r"/>
      </legenditem>
      </xsl:for-each>
      </legend>
      </xsl:if>
      </graphic>
      </xsl:template>

    Ich bekomme mit diesem Stylesheet die folgende falsche XML-Ausgabe:

    Code:
             <graphic graphwidth="other">
                <figure graphicname="Winter.jpg"/>
                <caption>Eine Bildbeschriftung fürs 1. Bild!</caption>
                <legend>
                   <legenditem>1. Legendentext 1. Bild</legenditem>
                   <legenditem>2. Legendentext 1. Bild</legenditem>
                   <legenditem>3. Legendentext 1. Bild</legenditem>
                   <legenditem>1. Legendentext 2. Bild</legenditem>
                   <legenditem>2. Legendentext 2. Bild</legenditem>
                   <legenditem>3. Legendentext 2. Bild </legenditem>
                </legend>
             </graphic>
             <paragraph>HAUPTTEXT2!!!</paragraph>
             <paragraph>HAUPTTEXT3</paragraph>
             <graphic graphwidth="other">
                <figure graphicname="Blaue Berge.jpg"/>
                <caption>Eine Bildunterschrift</caption>
                <legend>
                   <legenditem>1. Legendentext 2. Bild</legenditem>
                   <legenditem>2. Legendentext 2. Bild</legenditem>
                   <legenditem>3. Legendentext 2. Bild </legenditem>
                </legend>
             </graphic>

    Eigentlich soll die XML-Ausgabe so aussehen:

    Code:
    <graphic graphwidth="other">
                <figure graphicname="Winter.jpg"/>
                <caption>Eine Bildbeschriftung fürs 1. Bild!</caption>
                <legend>
                   <legenditem>1. Legendentext 1. Bild</legenditem>
                   <legenditem>2. Legendentext 1. Bild</legenditem>
                   <legenditem>3. Legendentext 1. Bild</legenditem>
                </legend>
             </graphic>
             <paragraph>HAUPTTEXT2!!!</paragraph>
             <paragraph>HAUPTTEXT3</paragraph>
             <graphic graphwidth="other">
                <figure graphicname="Blaue Berge.jpg"/>
                <caption>Eine Bildunterschrift</caption>
                <legend>
                   <legenditem>1. Legendentext 2. Bild</legenditem>
                   <legenditem>2. Legendentext 2. Bild</legenditem>
                   <legenditem>3. Legendentext 2. Bild </legenditem>
                </legend>
             </graphic>
    Was ist am Stylesheet falsch? Ich bekomme die richtige Selektion nicht hin!
    Vielen Dank für die Hilfe.

  • #2
    Du willst Elemente gruppieren, mit XSLT 2.0 benutze for-each-group group-starting-with, mit XSLT 1.0 benutze einen key:
    Code:
    <!-- als Kindelement von xsl:stylesheet -->
    <xsl:key name="k1"
                   match="w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphiclegend']"
                   use="generate-id(preceding-sibling::w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphicfigure']][1])"/>
    dann im Template statt
    Code:
      <xsl:for-each select="following-sibling::w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphiclegend']]">
    
    
      <legenditem>  
      <xsl:apply-templates select="w:r"/>
      </legenditem>
      </xsl:for-each>
    benutze
    Code:
      <xsl:for-each select="key('k1', generate-id(current()))">
        <legenditem>  
          <xsl:apply-templates select="w:r"/>
        </legenditem>
      </xsl:for-each>

    Comment


    • #3
      Vielen Dank für deine kompetente Hilfe.

      Ich habe noch Fragen zum Verständnis. Evtl. könntest du die beantworten:

      Also mit
      Code:
      <xsl:for-each select="key('descriptivebodygraphiclegend_key', generate-id(current()))">
      rufe ich den key mit dem Namen "descriptivebodygraphiclegend_key" auf. Warum brauche ich da noch eine generate-id(current())"-Funktion?

      Hier ist die entsprechende Key-Definition:

      Code:
      <xsl:key name="descriptivebodygraphiclegend_key"
                     match="w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphiclegend']]"
                     use="generate-id(preceding-sibling::w:p[w:pPr/w:pStyle[@w:val = 'descriptivebodygraphicfigure']][1])"/>
      Was genau machen die match- und use-Attribute in der Key-Definition?

      Comment


      • #4
        Das xsl: key Element legt einen Index an, um effizient auf Knoten zugreifen zu können. Das match-Attribut wählt die Knoten aus, die indiziert werden sollen, das use-Attribut legt den Wert fest, unter dem indiziert werden soll.
        Mit Hilfe der "key"-Funktion kann man dann effizient zugreifen, mittels
        Code:
        key('keyName', someXPathExpression)
        werden die Knoten geliefert, die den entsprechen key-Wert haben, der sich aus someXPathExpression ergibt.

        Wenn man also etwa
        Code:
        <root>
           <item>
              <id>item1</id>
              <foo>a</foo>
           </item>
           <item>
              <id>item2</id>
              <foo>b</foo>
           </item>
           <item>
              <id>item3</id>
              <foo>a</foo>
           </item>
        </root>
        hat und dann einen Schlüssel ("key") wie folgt definiert
        Code:
        <xsl:key name="k1" match="item" use="foo"/>
        dann liefert etwa
        key('k1', 'a')
        die 'item' Elemente mit id "item1" und "item3".

        Comment


        • #5
          OK, aber warum braucht man generate-id(current())?


          Wo finde ich im Internet auch noch gute Erklärungen zum Thema? Weißt du da Seiten?
          Zuletzt editiert von ultimate-hunteR; 15.04.2010, 17:12.

          Comment


          • #6
            Wenn der key über eine generierte id definiert ist, dann macht es nur Sinn, als zweites Argument der "key"-Funktion auch eine solche generierte id zu übergeben.

            Was "Seiten" im Internet angeht, die W3C Spezifikationen zu XSLT und XPath sind online:
            http://www.w3.org/TR/xslt
            http://www.w3.org/TR/xpath/

            Einen oberflächlichen aber leichteren Einstieg bietet http://www.w3schools.com/

            Comment


            • #7
              Ist die ID der Key-Funktion gleich zu der generierten ID des Keys?

              Comment

              Working...
              X