2009-09-30 21 views
28

Tengo una lista de noticias, clasificadas por fechaCreated. Tengo un control de cuadro de vista previa donde solo quiero mostrar el primer elemento. ¿Cómo puedo hacer eso usando XSLT?¿Cómo puedo seleccionar el primer 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> 

Respuesta

46

Si desea enviar la salida XHTML 1.1, aquí hay una manera:

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

¡Impresionante, gracias! –

+0

El problema con [1] es que si también necesito procesar los nodos normalmente, se ha consumido el primer nodo. Entonces, si todos los sitios nuevos deben procesarse, pero el primero debe procesarse especialmente (como los encabezados de tabla de salida), usar este enfoque no funcionará. Espero encontrar eso. – tggagne

+0

@tggagne No estoy seguro de lo que quiere decir con "consumido". Si necesita hacer encabezados, haga eso más arriba en el árbol, es decir 'match =" // news [newsitem] "', luego aplique-templates desde allí. – brianary

14
//newsItem[1] 

debe hacer

+3

XPath comienza a contar en 1. – Tomalak

+1

woops, mi error – knittl

6

que tenía la misma pregunta y creo que he encontrado una mejor respuesta:

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

Selecciona el primer elemento de libro newsItem, pero tenga en cuenta que IE5 y más tarde ha implementado [0] que debería ser el primer nodo, pero de acuerdo con el estándar W3C que debería ser [1]!

Cuestiones relacionadas