Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo Leute,

ich versuch mich gerade mal wieder etwas mit XSLT auseinander zu setzen und hab eigentlich ein einfaches Beispiel, nur scheinbar denk ich zu kompliziert und mir fällt einfach nicht ein was ich falsch mache.

Folgendes Szenario:

Ich habe ein XML das in etwa so aussieht:

<root>
  <elemente>
    <element>
    	<id>1</id>
    </element>
    <element>
    	<id>2</id>
    </element>
  </elemente>
  <testfälle>
    <testfall>
      <tid>1</tid>
      <beschreibung>hshgoasn</beschreibung>
    </testfall>
    <testfall>
      <tid>2</tid>
      <beschreibung>dhfoashgfon</beschreibung>
    </testfall>
  </testfälle>
</root>

nun möchte ich das ganze in einer HTML Tabelle über ein XSLT ausgeben:

<table width="100%">
	<tr>
		<th>ID</th>
		<th>Bezeichnung</th>
	</tr>
	<xsl:for-each select="/root/elemente/element">
		<tr>
			<td><xsl:value-of select="id"/></td>
			<td><xsl:value-of select="/root/testfälle/testfall/bezeichnung"/></td> <!-- soll nur die Beschreibung ausgeben bei der die "tid" identisch mit der "id" ist -->
		</tr>	
	</xsl:for-each>
</table>

Das ist jetzt sehr einfach runtergebrochen.

Mein Problem ist das ich mir zwar die Beschreibungen ausgeben lassen kann, jedoch beide Beschreibungen für die entsprechenden tid zusammen ausgegeben werden. Ich habe verschiedenste XPath ausdrücke probiert, aber irgendwie bekomme ich es nicht hin das ich pro Zeile nur die Beschreibung für die entsprechende "ID" in dieser Zeile bekomme.

Vielleicht kennt sich hier ja einer mit XSLT aus und kann mir da nen Tipp geben wie ich den XPath Ausdruck formulieren muss das ich nur das ausgegeben bekomme das ich haben will.

 

Gelöst von JimTheLion

Zur Lösung

Moin,

<xsl:value-of select="/root/testfälle/testfall[./tid=id]/bezeichnung"/>

In die Richtung müsste das gehen. Ich bin mir gerade nicht sicher ob es wirklich "id" oder eher "./id" ist.

Jedenfalls kommt in die eckigen Klammern die Suche. "in Root -> in Testfälle -> der Testfall, bei dem das untergeordnete Blatt tid der id entspricht"

//root/testfalle/testfall[./tid=1]/beschreibung

Würde also die Beschreibung vom ersten Testfall selektieren.

  • Autor

Hi PVoss,

danke für die Antwort, das hatte ich tatsächlich auch schon Probiert zusätzlich auch in folgender Form:

/root/testfälle/testfall[tid=//id]/bezeichnung

das Problem dann wird mir das ganze in der Tabelle so angezeigt:

1520671200_Screenshot2019-03-1922_09_28.png.08cd7a632363bba2903ee5dd0c616951.png

richtig wäre es aber so:

69883350_Screenshot2019-03-1922_09_34.png.a2c197494fca5acbcd8e21e1f386b773.png

Ich bin mir sicher das das Problem nicht schwer ist, aber irgendwas übersehe ich hier und mir fällt nicht auf was ?

 

Keine Ahnung ob das eleganter geht, aber mit ner xsl variablen kann man es zumindest machen

<xsl:variable name="elementId"><xsl:value-of select="id"/></xsl:variable>
<td><xsl:value-of select="/root/testfalle/testfall[tid=$elementId]/beschreibung" /></td> 

 

  • Autor
vor 3 Minuten schrieb _n4p_:

Keine Ahnung ob das eleganter geht, aber mit ner xsl variablen kann man es zumindest machen

 

Stimmt mit einer Variable ist es etwas eleganter, werd ich mal einbauen ?? Leider löst das mein Problem noch nicht ?

also ich bekomme dann diesen output

<html>
   <body>
      <table width="100%">
         <tr>
            <th>ID</th>
            <th>Bezeichnung</th>
         </tr>
         <tr>
            <td>1</td>
            <td>hshgoasn</td>
         </tr>
         <tr>
            <td>2</td>
            <td>dhfoashgfon</td>
         </tr>
      </table>
   </body>
</html>

 

  • Lösung

Jop, hab auch ein bisschen ausprobiert und man braucht wohl leider eine Variable.

<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet type="text/xsl" href="xsltest.xsl"?>
<root>
  <elemente>
    <element>
    	<id>1</id>
    </element>
    <element>
    	<id>2</id>
    </element>
  </elemente>
  <testfälle>
    <testfall>
      <tid>1</tid>
      <beschreibung>hshgoasn</beschreibung>
    </testfall>
    <testfall>
      <tid>2</tid>
      <beschreibung>dhfoashgfon</beschreibung>
    </testfall>
  </testfälle>
</root>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
  <xsl:output method="text"/>
  
	<xsl:template match="/">
		<xsl:for-each select="./root/elemente/element">
			<xsl:variable name="elemtId" select="./id" />
			ID: <xsl:value-of select="./id"/>
			Beschreibung: <xsl:value-of select="//testfälle/testfall[./tid=$elemtId]/beschreibung"/>
		</xsl:for-each>
	</xsl:template>
  
</xsl:stylesheet>

image.png.12acf9272dddced93bd35441400357f0.png

 

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.