2013-06-04 16 views
6

Meine XML bietet mir mehrere Bilder auszuwählen, die unterschiedliche mmids zugewiesen:Wie nur erste Knoten in Xslt

<Mediendaten> 
    <Mediendaten mmid="22404"> 
     <url size="original">A 22404 FILE</url> 
     <url size="thumb">ANOTHER 22404 FILE</url> 
    </Mediendaten> 
    <Mediendaten mmid="22405"> 
     <url size="original">A 22405 FILE</url> 
     <url size="thumb">ANOTHER 22405 FILE</url> 
    </Mediendaten> 
<Mediendaten> 

Mein XSLT wählt nur die URLs, wo size = Daumen:

<xsl:template match="/Mediendaten"> 
<xsl:apply-templates select="Mediendaten/url"> 
</xsl:apply-templates> 
</xsl:template> 

<xsl:template match="Mediendaten/url"> 
<xsl:if test="@size = 'thumb'"> 
<img width="280" border="0" align="left"> 
<xsl:attribute name="src"><xsl:value-of select="."/></xsl:attribute> 
</img> 
</xsl:if> 
</xsl:template> 

JEDOCH Ich brauche nur das Vorschaubild von der ersten mmid (in diesem Fall 22404). Ich habe keine Kontrolle über den mmid Wert.

Wie stoppe ich meine Vorlage, so dass nur die Daumendatei der ersten mmid ausgegeben wird?

Vielen Dank für jede Hilfe!

+0

Anstatt mit einem '' innerhalb Ihrer Vorlage können Sie setzen, dass die Kriterien innerhalb der Vorlage match: '' . Es gibt dem XSLT-Prozessor eine Chance zur Optimierung und vereinfacht das Stylesheet. –

Antwort

10

Der einfachste Weg ist die Vorlage für /Mediendaten zu ändern:

<xsl:template match="/Mediendaten"> 
    <xsl:apply-templates select="Mediendaten[@mmid][1]/url"/> 
</xsl:template> 

Die [@mmid] schränkt die Auswahl an Kinder Mediendaten Elemente, die das mmid Attribut tragen, die [1] schränkt die Auswahl zu dem ersten von diesen.

P.S. Wer auch immer die von Ihnen verwendete XML entwickelt hat, hasst Sie. (Den gleichen Namen für beide Arten von Elementen zu verwenden, jetzt Mediendaten, ist ein dreckiger, mieser Trick; er macht alles, was Sie mit den Daten machen, schwerer. Versuchen Sie herauszufinden, was Sie getan haben, um sie so wütend zu machen und wieder gut zu machen ein Wort zu den Weisen.)

+1

Große Antwort. Vielen Dank. Arbeitete perfekt. Und du hast recht: das XML ist 'herausfordernd' ... Wir schicken ihnen Blumen und eine gute Flasche Wein;) –

+1

@RichardTinkler hast du es ihnen geschickt? – Crt

1
<xsl:apply-templates select="Mediendaten[1]/url" /> 
0

Somme empfiehlt.

Zuerst folgen Sie dem Vorschlag von Mads Hansen. Habe eine Vorlage, die nun mit "Daumen" -Bildern umgehen kann.

<xsl:template match="Mediendaten/url[@size = 'thumb']" > 
    <img width="280" border="0" align="left" src="{.}" /> 
</xsl:template> 

Dann, wenn Sie nur die erste pocht Bild ausgibt wie (von Mediendaten in Dokument bestellen) verwenden:

<xsl:template match="/Mediendaten"> 
    <xsl:apply-templates select="Mediendaten[1]/url[@size = 'thumb']" /> 
</xsl:template> 

Aber wenn die Bedeutung von
„Aber ich nur brauchen das thumbnail von der ersten mmid " ist keine Mediendaten (mit mmid) in Dokumentenreihenfolge, sondern die von Mediendaten mit der kleinsten mmid. Versuchen Sie folgendes:

<xsl:template match="/Mediendaten"> 
    <xsl:for-each select="Mediendaten"> 
     <xsl:sort select="@mmid"/> 
     <xsl:if test="position()=1"> 
      <xsl:apply-templates select="url[@size = 'thumb']" /> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template>