2013-06-04 17 views
6

Moje XML dostarcza mi wielu obrazów przypisanych do różnych mmids:Jak wybrać pierwszy węzeł tylko w 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> 

Moja XSLT wybiera tylko te adresy URL, gdzie size = kciuk:

<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> 

JEDNAK Potrzebuję tylko miniatury z pierwszego mmid (w tym przypadku 22404). Nie mam kontroli nad wartością mmid.

Jak zatrzymać szablon, aby wyświetlał tylko plik kciuka pierwszego mmid?

Wielkie dzięki za pomoc!

+0

Zamiast używać '' wewnątrz szablonu, można umieścić, że kryteria wewnątrz szablonu meczu: '' . Da to procesorowi XSLT szansę na optymalizację i upraszcza arkusz stylów. –

Odpowiedz

10

Najprostszym sposobem jest zmienić szablon dla /Mediendaten:

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

Sieć [@mmid] ogranicza wybór na dziecko Mediendaten elementów przenoszących atrybut mmid, [1], ogranicza wybór do pierwszego z nich.

P.S. Ktokolwiek zaprojektował XML, którego używasz, nienawidzi cię. (Używanie tej samej nazwy dla obu rodzajów teraz oznaczonych jako Mediendaten jest brudną, zepsutą sztuczką, sprawia, że ​​wszystko, co robisz z danymi, jest trudniejsze, staraj się rozgryźć, co zrobiłeś, aby je tak bardzo wkurzyć i naprawić je. słowo do mądrych.)

+1

Świetna odpowiedź. Dzięki. Działa doskonale. I masz rację: XML jest "trudny" ... wyślemy im kwiaty i dobrą butelkę wina;) –

+1

@RichardTinkler czy kiedykolwiek wysłałeś je do nich? – Crt

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

Somme pochwala.

Przede wszystkim postępuj zgodnie z sugestią Mads Hansen. Miej szablon, który teraz radzi sobie z obrazkami "kciuka".

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

Następnie, jeśli chcesz do wyjścia tylko uderzenie pierwszym zdjęciu (od Mediendaten w kolejności dokumentu) używać:

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

Ale jeśli sens
„Jednakże, tylko muszę miniatura z pierwszego mmid " nie jest Mediendaten (z mmid) w porządku dokumentu, ale od Mediendaten z najmniejszym mmid. Spróbuj tego:

<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> 
Powiązane problemy