2011-11-16 11 views
5

Estoy tratando de generar páginas html usando xslt (usando VS 2010 como editor y 'compilador/transformador'). La mayoría de esto funciona bien y genera xhtml válido, pero cuando intenta generar una lista ordenada con la ayuda de <xsl:sort />, el orden no se ve afectado en absoluto. Lo he visto funcionar, pero cuando trato de determinar mi problema y crear el código de muestra a continuación, ninguno de mis <xsl:sort /> funcionó.xsl: ordena, ¿por qué no funciona?

Por favor, ¿quién puede mostrarme mi error?

A continuación se muestran mis archivos de muestra.

sample.xml

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="sample.xsl" ?> 
<people> 
    <person name="Jack" age="12"> 
     <adress>First road</adress> 
    </person> 
    <person name="Bob" age="8"> 
     <adress>Third road</adress> 
    </person> 
    <person name="Peter" age="20"> 
     <adress>Second road</adress> 
    </person> 
    <person name="Juli" age="65"> 
     <adress>Last road</adress> 
    </person> 
    <person name="Abbot" age="21"> 
     <adress>No road</adress> 
    </person> 
</people> 

sample.xsl

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 

    <xsl:output 
     method="xml" 
     omit-xml-declaration="yes" indent="yes" 
     doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
     doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" /> 

    <xsl:template match="/"> 
     <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
      <head> 
       <title>Sample</title> 

       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
      </head> 

      <body> 
       <h2>By @name</h2> 
       <div> 
        <xsl:for-each select="people/person"> 
         <xsl:sort select="@name" data-type="text" order="ascending" /> 
         <xsl:value-of select="@name" /> 
         <xsl:element name="br" /> 
         <xsl:text /> 
        </xsl:for-each> 
       </div> 
       <hr /> 
       <h2>By @age</h2> 
       <div> 
        <xsl:for-each select="people/person"> 
         <xsl:sort select="@age" data-type="number" order="ascending" /> 
         <xsl:value-of select="@age" /> 
         <xsl:element name="br" /> 
         <xsl:text /> 
        </xsl:for-each> 
       </div> 
       <hr /> 
       <h2>By adress</h2> 
       <div> 
        <xsl:for-each select="people/person"> 
         <xsl:sort select="adress" data-type="text" order="ascending" /> 
         <xsl:value-of select="adress" /> 
         <xsl:element name="br" /> 
         <xsl:text /> 
        </xsl:for-each> 
       </div> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 
+0

En realidad, funciona bastante bien. No estoy seguro de cuál es tu problema. – FailedDev

+0

Estoy viendo el mismo problema que él tiene en vs2010, pero el código funciona bien en vs2008. Parece un problema de procesador xml. – Bert

Respuesta

5

Puedes solucionar este problema en su hoja de estilo, cambiando la versión de hoja de estilo a 1,0. En otras palabras, cambie

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 

Para

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 

Esto parece ser un error en el .NET 4 transformación XSL código. Consulte esta pregunta relacionada con stackflow, Problem with XSL sorting.

Lo que parece suceder es que cada vez que intenta ordenar por un atributo, en realidad ordena por el primer elemento secundario. Por ejemplo, cambiar el código XML a esto y los nombres va a clasificar correctamente:

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="Sample.xslt" ?> 
<people> 
    <person name="Jack" age="12"> 
    <name>Jack</name> 
    <adress>First road</adress> 
    </person> 
    <person name="Bob" age="8"> 
    <name>Bob</name> 
    <adress>Third road</adress> 
    </person> 
    <person name="Peter" age="20"> 
    <name>Peter</Name> 
    <adress>Second road</adress> 
    </person> 
    <person name="Juli" age="65"> 
    <name>Juli</Name> 
    <adress>Last road</adress> 
    </person> 
    <person name="Abbot" age="21"> 
    <name>Abbot</Name> 
    <adress>No road</adress> 
    </person> 
</people> 

He encontrado una respuesta de Microsoft sobre el tema aquí, http://connect.microsoft.com/VisualStudio/feedback/details/620628/problem-with-xsl-sort-nodes-when-using-xslcompiledtransform, lo que me llevó a la solución he sugerido más arriba. Puede intentar jugar con el número de versión de la hoja de estilo para ver qué funciona y qué no funciona.

+0

+1 Buena captura :) – FailedDev

Cuestiones relacionadas