verenice: XSL / Bildausgabe...

Hallo,
ich möchte gern bestimmte Bilder ausgeben.
Dazu habe ich einmal versucht bei der Bildausgabe eine Variable mit dem Wert zu übergeben.
Leider funktioniert dies überhaupt nicht.
Dann habe ich direkt versucht genau ein bestimmtes Bild aus dem XML-File herauszuholen. Dies hat leider auch nicht funktioniert.
Das Bild mit der id='5' wurde nicht ausgegeben.
Was mache ich falsch?
Und wie kann ich es schaffen, dass immer genau das Bild ausgegeben wird,
dessen id über die Handbuchstruktur gerade in der Variable gespeichert ist??

<img src="Bilder/{//Bild[@id=$bildRef]}" alt="{//Bild/@alt[@id=$bildRef]}" width="{//Bild/@width[@id=$bildRef]}"
heigth="{//Bild/@height[@id=$bildRef]}" />

<img src="Bilder/{//Bild[@id='5']}" alt="{//Bild/@alt}" width="{//Bild/@width}" height="{//Bild/@height}" />

Quelltext:

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

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

<!-- Variablen, in denen der XPath-Pfad gespeichert ist. -->
 <xsl:variable name="pfadHandbuchstruktur" select="Handbuch/Handbuchstruktur" />
 <xsl:variable name="pfadHandbuchinhalt" select="Handbuch/Handbuchinhalt" />

<!-- Startvorlage -->
  <xsl:template match="/">
     <!--<xsl:result-document href="Kapitel{@id}.html">-->
         <html>
            <head>
              <title>
                <xsl:value-of select="$pfadHandbuchstruktur/Handbuchtitel" />
              </title>
              <!--  <link rel="stylesheet" type="text/css" href="KapitelAlsHTMLausgeben.css" />-->
            </head>

<body>
               <h1>
                 <xsl:value-of select="$pfadHandbuchstruktur/Handbuchtitel" />
               </h1>
               <p>
      <xsl:apply-templates select="$pfadHandbuchstruktur/KapitelRef" />
               </p>
            </body>
         </html>
     <!--</xsl:result-document>-->
   </xsl:template>

<xsl:template match="KapitelRef">

<xsl:variable name="bildRef">
   <xsl:value-of select="BildRef/@id" />
   <br />
  </xsl:variable>

<!-- Ermittel die id vom BildRef in der Handbucstruktur und gibt dann das dazugehörige Bild aus -->
  xsl:textBildRef: </xsl:text>
  <xsl:value-of select="BildRef/@id" />
  <br />
  xsl:textBild: </xsl:text>
  <xsl:value-of select="//Bild[@id=$bildRef]" />
  <br />
  <br />
  <!--<img src="Bilder/{//Bild[@id='5']}" alt="{//Bild/@alt[@id=$bildRef]}" width="{//Bild/@width[@id=$bildRef]}" heigth="{//Bild/@height[@id=$bildRef]}" />-->
  <img src="Bilder/{//Bild[@id='5']}" alt="{//Bild/@alt}" width="{//Bild/@width}" height="{//Bild/@height}" />
  <br />
  <br />

<hr />

</xsl:template>
</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Kyriazis (Volkswagen AG) -->
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="Handbuch">
  xs:annotation
   xs:documentationroot element</xs:documentation>
  </xs:annotation>
  xs:complexType
   xs:sequence
    <xs:element name="Handbuchstruktur">
     xs:complexType
      xs:sequence
       <xs:element name="Handbuchtitel" type="xs:string"/>
       <xs:element name="KapitelRef" maxOccurs="unbounded">
        xs:complexType
         <xs:sequence minOccurs="0" maxOccurs="unbounded">
          <xs:element name="TextRef" minOccurs="0" maxOccurs="unbounded">
           xs:complexType
            xs:simpleContent
             <xs:extension base="xs:string">
              <xs:attribute name="id" type="xs:string" use="required"/>
             </xs:extension>
            </xs:simpleContent>
           </xs:complexType>
          </xs:element>
          <xs:element name="BildRef" minOccurs="0" maxOccurs="unbounded">
           xs:complexType
            xs:simpleContent
             <xs:extension base="xs:string">
              <xs:attribute name="id" type="xs:string" use="required"/>
             </xs:extension>
            </xs:simpleContent>
           </xs:complexType>
          </xs:element>
         </xs:sequence>
         <xs:attribute name="id" type="xs:string" use="required"/>
        </xs:complexType>
       </xs:element>
      </xs:sequence>
     </xs:complexType>
    </xs:element>
    <xs:element name="Handbuchinhalt">
     xs:complexType
      xs:sequence
       <xs:element name="Text">
        xs:complexType
         xs:sequence
          <xs:element name="Textbaustein" maxOccurs="unbounded">
           xs:complexType
            xs:simpleContent
             <xs:extension base="xs:string">
              <xs:attribute name="id" type="xs:string" use="required"/>
              <xs:attribute name="autor" type="xs:string" use="required"/>
              <xs:attribute name="datum" type="xs:string" use="required"/>
             </xs:extension>
            </xs:simpleContent>
           </xs:complexType>
          </xs:element>
         </xs:sequence>
        </xs:complexType>
       </xs:element>
       <xs:element name="Bild" maxOccurs="unbounded">
        xs:complexType
         xs:simpleContent
          <xs:extension base="xs:string">
           <xs:attribute name="id" type="xs:string" use="required"/>
           <xs:attribute name="bildunterschrift" type="xs:string" use="required"/>
           <xs:attribute name="src" type="xs:string" use="required"/>
           <xs:attribute name="width" type="xs:string" use="required"/>
           <xs:attribute name="height" type="xs:string" use="required"/>
           <xs:attribute name="alt" type="xs:string" use="required"/>
          </xs:extension>
         </xs:simpleContent>
        </xs:complexType>
       </xs:element>
       <xs:element name="KapitelName" maxOccurs="unbounded">
        xs:annotation
         xs:documentationdas Attribut titelAbk ist bei der Website für das Menü</xs:documentation>
        </xs:annotation>
        xs:complexType
         xs:simpleContent
          <xs:extension base="xs:string">
           <xs:attribute name="id" type="xs:string" use="required"/>
           <xs:attribute name="kapiteltyp" type="xs:string" use="required"/>
           <xs:attribute name="formatierung" type="xs:string" use="required"/>
           <xs:attribute name="titelAbk" type="xs:string" use="required"/>
          </xs:extension>
         </xs:simpleContent>
        </xs:complexType>
       </xs:element>
      </xs:sequence>
     </xs:complexType>
    </xs:element>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

Vielen Dank im voraus für Eure Hilfe.

Viele Grüße
verenice

  1. Hallo,

    ich möchte gern bestimmte Bilder ausgeben.
    Dazu habe ich einmal versucht bei der Bildausgabe eine Variable mit dem Wert zu übergeben.
    Leider funktioniert dies überhaupt nicht.
    Dann habe ich direkt versucht genau ein bestimmtes Bild aus dem XML-File herauszuholen. Dies hat leider auch nicht funktioniert.
    Das Bild mit der id='5' wurde nicht ausgegeben.
    Was mache ich falsch?
    Und wie kann ich es schaffen, dass immer genau das Bild ausgegeben wird,
    dessen id über die Handbuchstruktur gerade in der Variable gespeichert ist??

    <img src="Bilder/{//Bild[@id=$bildRef]}" alt="{//Bild/@alt[@id=$bildRef]}" width="{//Bild/@width[@id=$bildRef]}"
    heigth="{//Bild/@height[@id=$bildRef]}" />

    Sowas wie: //Bild/@alt[@id=$bildRef] kann nicht funktionieren.
    Ein Attribut (in dem Fall @alt) hat keinen Kindknoten, du kannst also auch nicht auf eines nicht vorhandenen Attributes eine attributes zugreifen.

    Was du meinst ist:
    <img src="Bilder/{//Bild[@id=$bildRef]}" alt="{//Bild[@id=$bildRef]/@alt}" width="{//Bild[@id=$bildRef]/@width}"
    heigth="{//Bild[@id=$bildRef]/@height}" />

    Wenn ich deine Schema betrachte, dass steht die URL des Bildes aber nciht im Element "Bild" selbst, sondern in dessen @src-Attribut.
    Also müsste dein XSL so aussehen:
    <img src="Bilder/{//Bild[@id=$bildRef]/@src}" alt="{//Bild[@id=$bildRef]/@alt}" width="{//Bild[@id=$bildRef]/@width}"
    heigth="{//Bild[@id=$bildRef]/@height}" />

    ABER, weil du in deiner Variable $bildRef etwas falsches machst, kann das auch nciht funktionieren:

    <xsl:template match="KapitelRef">
      <xsl:variable name="bildRef">
       <xsl:value-of select="BildRef/@id" />
       <br />
      </xsl:variable>

    1. da es mehrere BildRef-Elemente geben kann, ist schon überhaupt fraglich, welches Element denn die Variable nehmen soll.
    2. value-of sorgt dann dafür, dass es immer nur eines genommen wird und zwar das erste BildRef, das value-of über den Weg läuft.
    3. am Ende siehst deine Variable etwa so aus:

    bild123<br />

    und jetzt willst du ein Bild suchen dessen ID "bild123<br />" lautet.
    Das geht natürlich nicht.
    Ein: <xsl:variable name="bildRef" select="BildRef/@id" /> behebt, Problem 3 und telilweise 2. Aber Problem 1 bleibt: welche von mehreren BildRef-Elementen soll denn genommen werden?

    Grüße
    Thomas

    1. ... und ich soll(te) heute nichts mehr tippen.
      Aber ich denke, du kannst meine Tippfehler entziffern.

      Grüße
      Thomas

      1. Hallo Thomas,
        vielen vielen Dank für Deine schnelle Hilfe!:o)
        Es funktioniert jetzt so wie ich das haben möchte.*Freu*

        Viele Grüße
        verenice