2009-09-30 15 views
28

Ho una lista di notizie, ordinate per dataCreato. Ho un controllo casella di anteprima in cui voglio solo mostrare il primo elemento. Come posso farlo usando XSLT?Come posso selezionare il primo elemento usando XSLT?

<xml> 
    <news> 
     <newsitem> 
      <dateCreated>2009-09-09</dateCreated> 
      <summary>Something great happened</sumamry> 
     </newsitem> 
     <newsitem> 
      <dateCreated>2009-09-08</dateCreated> 
      <summary>Something bad happened</sumamry> 
     </newsitem> 
     <newsitem> 
      <dateCreated>2009-09-07</dateCreated> 
      <summary>Something really bad happened</sumamry> 
     </newsitem> 
    </news> 
</xml> 

risposta

46

Se si desidera uscita XHTML 1.1, Ecco un modo:

<?xml version="1.0"?> 
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xsl xs"> 
<xsl:output mode="xhtml" version="1.1" omit-xml-declaration="yes" 
    encoding="utf-8" media-type="application/xhtml+xml" indent="no" 
    doctype-public="-//W3C//DTD XHTML 1.1//EN" 
    doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" /> 

<xsl:template match="//newsItem[1]"> 
    <div><xsl:value-of select="dateCreated"/></div> 
    <div><xsl:value-of select="summary"/></div> 
</xsl:template> 

</xsl:transform> 
+0

Impressionante, grazie! –

+0

Il problema con [1] è che se devo anche elaborare normalmente i nodi, il primo nodo è stato consumato. Quindi, se tutti i newsitem devono essere elaborati, ma il primo deve essere elaborato appositamente (come le intestazioni delle tabelle di output), l'utilizzo di questo approccio non funzionerà. Spero di trovarlo. – tggagne

+0

@tggagne Non sei sicuro di cosa intendi per "consumato". Se hai bisogno di fare delle intestazioni, forse fai quella più in alto nell'albero, cioè "match =" // news [newsitem] "', quindi applica i template dall'interno. – brianary

14
//newsItem[1] 

dovrebbe fare

+3

XPath inizia a contare a 1. – Tomalak

+1

woops, il mio errore – knittl

6

ho avuto la stessa domanda e credo di aver trovato una risposta migliore:

<xsl:for-each select="newsItem[1]"> 
    <div><xsl:value-of select="dateCreated"/></div> 
    <div><xsl:value-of select="summary"/></div> 
</xsl:for-each> 
1
//newsItem[1] 

Seleziona il primo elemento book newsItem, ma si noti che IE5 e successivamente ha implementato che [0] dovrebbe essere il primo nodo, ma secondo lo standard W3C dovrebbe essere [1]!

Problemi correlati