Announcement

Collapse
No announcement yet.

For-each Werte auslesen

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

  • For-each Werte auslesen

    Hallo Forum,

    meine Frage lautet: Wie kann ich mit einer for-each Schleife nur bestimmte Elemente anzeigen?
    Bsp. XML-Struktur

    Code:
    <Element>
      <Attribute name="Zipper">
         <name>I18N Translation of Zipper</name>
         <value>ok</value>
      </Attribute>
      <Attribute name="Fabric">
         <name>I18N Translation of Fabric</name>
         <value>ok</value>
      </Attribute>
      <Attribute name="Width">
         <name>I18N Translation of Width</name>
         <value>nok</value>
      </Attribute>
    </Element>
    <Element>
      <Attribute name="Zipper">
         <name>I18N Translation of Zipper</name>
         <value>undefined</value>
      </Attribute>
      <Attribute name="Fabric">
         <name>I18N Translation of Fabric</name>
         <value>nok</value>
      </Attribute>
      <Attribute name="Width">
         <name>I18N Translation of Width</name>
         <value>ok</value>
      </Attribute>
    </Element>
    <Element>
    ...
    </Element>
    ...
    <Element_n>
    </Element_n>
    Jedes <Element> ist vom gleichen Typ und enthält die gleichen Attribute nur eben mit unterschiedlichen Werten. Nun möchte ich in einer for-each Schleife alle Elemente in einer Tabelle darstellen, aber nicht alle Attribute, sondern nur festgelegte Attribute, bspw. nur "Zipper" und "Width" kein anderes.

    Code:
    <xsl:for-each select="Element">
      <xsl:value-of select="Attribute[@name='Zipper']/name" />
      <xsl:value-of select="Attribute[@name='Width']/ value" />
    </xsl:for-each>
    Leider funktioniert das aber nicht so. Ich habe mir Dokus durchgelesen aber irgendwas habe ich falsch verstanden?

    Danke für die Hilfe,
    MAF1981

  • #2
    Erkläre mal genauer, was du ausgeben willst. Eine HTML-Tabelle? Welche Zeilen und Spalten soll diese haben?
    Dein XSLT sieht nicht falsch aus, was die Pfadausdrücke betrifft, aber du hast nicht weiter beschrieben, was "nicht funktioniert". Wie sieht das Resultat im Moment aus, welches Resultat willst du haben?

    Comment


    • #3
      Daten nicht nur mit Foreach ausgeben
      besser über template

      mit template beschreibt mann was passieren soll wenn der parser auf den knoten trift
      habe noch param eingefügt damit kann man von aussen den Parser steuern
      einige Parser und Erklärungen dazu

      http://www.sagehill.net/docbookxsl/I...Processor.html

      beispiel Html datei

      xml zum Testen
      Code:
      <?xml version="1.0"?>
      <root>
      	<Element>
      		<Attribute name="Zipper">
      			<name>I18N Translation of Zipper</name>
      			<value>ok</value>
      		</Attribute>
      		<Attribute name="Fabric">
      			<name>I18N Translation of Fabric</name>
      			<value>ok</value>
      		</Attribute>
      		<Attribute name="Width">
      			<name>I18N Translation of Width</name>
      			<value>nok</value>
      		</Attribute>
      	</Element>
      	<Element>
      		<Attribute name="Zipper">
      			<name>I18N Translation of Zipper</name>
      			<value>undefined</value>
      		</Attribute>
      		<Attribute name="Fabric">
      			<name>I18N Translation of Fabric</name>
      			<value>nok</value>
      		</Attribute>
      		<Attribute name="Width">
      			<name>I18N Translation of Width</name>
      			<value>ok</value>
      		</Attribute>
      	</Element>
      </root>
      xsl datei
      Code:
      <?xml version="1.0"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:param name="wahl" select="'Width'"/>
      	<xsl:template match="/">
      		<html>
      		<h1><xsl:value-of select="$wahl"/></h1>
      			<table border="2px black"><tr><th>Name</th><th>Value</th></tr>
      				<xsl:apply-templates select="root/Element"/>
      			</table>
      		</html>
      	</xsl:template>
      
      
      	<xsl:template match="Element">
      		<tr>
      			<xsl:apply-templates select="Attribute[@name=$wahl]"/>
      			<!--
      			<xsl:apply-templates select="Attribute[@name='Width']"/>
      			<xsl:apply-templates select="Attribute[@name='Zipper']"/>
      			<xsl:apply-templates select="Attribute[@name='Fabric']"/>
      			-->
      		</tr>
      	</xsl:template>
      
      	<xsl:template match="Attribute">
      		<td>
      			<xsl:apply-templates select="name"/>
      		</td>
      		<td>
      			<xsl:apply-templates select="value"/>
      		</td>
      	</xsl:template>
      
      	<xsl:template match="name">
      		<xsl:value-of select="."/>
      	</xsl:template>
      
      	<xsl:template match="value">
      		<xsl:value-of select="."/>
      	</xsl:template>
      </xsl:stylesheet>
      Ergebniss
      Code:
      <html>
      	<h1>Width</h1>
      	<table border="2px black">
      		<tr>
      			<th>Name</th>
      			<th>Value</th>
      		</tr>
      		<tr>
      			<td>I18N Translation of Width</td>
      			<td>nok</td>
      		</tr>
      		<tr>
      			<td>I18N Translation of Width</td>
      			<td>ok</td>
      		</tr>
      	</table>
      </html>

      Comment


      • #4
        Hi,

        vielen Dank für eure Antworten.
        Das mit dem Template werde ich mir mal durchlesen und versuchen so nachzuvollziehen.
        Noch zum Hintergrund @Martin: Die Daten kommen alle aus einem PLM-System (Oracle basiert) und ich versuche die als PDF-Report zusammenzufassen. Leider bekomme ich in der vorhandenen Umgebung immer nur die Meldung "Could not compile Stylesheet" und dann ne Nullpointer in der Konsole.
        javax.xml.transform.TransformerConfigurationExcept ion: Could not compile stylesheet
        at com.sun.org.apache.xalan.internal.xsltc.trax.Trans formerFactoryImpl.newTemplates(TransformerFactoryI mpl.java:828)
        at com.sun.org.apache.xalan.internal.xsltc.trax.Trans formerFactoryImpl.newTransformer(TransformerFactor yImpl.java:617)
        Leider nicht mehr, daher habe ich auch erstmal keinen Anhaltspunkt wo ich da ansetzen könnte, zumal das ganze Framework für den Report auf einem zugekauften Third-Party Produkt basiert.

        Gruß,
        MAF1981

        Comment


        • #5
          Wenn du einen Fehlermeldung bekommst, können wir nur helfen, wenn wir eine minimales aber komplettes Stylesheet sehen, das uns erlaubt, den Fehler zu reproduzieren. Wenn du Java und Xalan benutzt, um das Stylesheet auszuführen, aber die derzeitige Umgebung keine präzisen Fehlermeldungen gibt, dann hilft es vermutlich, Xalan von http://xml.apache.org/xalan-j/ zu installieren und zu benutzen, das sollte dann präzisere Fehlermeldungen geben. Ich benutze für XSLT 1.0 auch gerne Saxon 6.5.5 von http://saxon.sourceforge.net/, weil es gute Fehlermeldungen gibt.
          Was den XSLT-Code angeht, um eine Tabelle auszugeben, so musst du noch erklären, ob du per XSLT aus XML erst XHTML und dann daraus PDF erzeugen willst, oder erst XSL-FO und dann daraus PDF.

          Comment


          • #6
            Vielen Dank für die Antworten,

            ich habe es mit Hilfe von Templates anstatt einer FOR-EACH Schleife hinbekommen.
            Verwendet wird XSL-FO und daraus wird dann das PDF erzeugt.

            Gruß,
            MAF1981

            Comment

            Working...
            X