2010-10-19 18 views
5

que tiene la siguiente XSLTXSLT ¿por qué aparece en mi hrefs?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    <xsl:output method="html" omit-xml-declaration="yes" /> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 

      <html> 
      <body> 
      <xsl:for-each select="AdvReqIMailMsg"> 

       <a><xsl:attribute name="href"> 
        http://<xsl:value-of select="BackSideUrl"/>/customerlogin.asp?P=<xsl:value-of select="DynaCalPath"/></xsl:attribute > 
       Login to View History of This Request 
       </a> 
       <br/> 
      </xsl:for-each> 
      </body> 
      </html> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

El resultado tiene el siguiente:

<a href="&#xA;     http://dotnet.dynacal.com/customerlogin.asp?P=DEMO8"> 
       Login to View History of This Request 
       </a> 

¿Por qué los &#xA; y todos los espacios allí? Soy nuevo en XSLT y mis búsquedas en Google no han revelado nada que yo entendiera. Gracias, Shawn

+0

Buena pregunta, +1. Vea mi respuesta para la solución más corta y más fácil de leer. :) –

+0

La misma causa (pero no realmente duplicada): http://stackoverflow.com/questions/848841/c-xslt-transform-adding-xa-and-xd-to-the-output – Lucero

Respuesta

5

El &#A; es un carácter de nueva línea codificado.

Esto y los espacios se conservan de la nueva línea y espacios en su XSLT.

1

No estoy muy familiarizado con XSLT yo tampoco, pero como una conjetura de la experiencia general de programación, intente cambiar

<xsl:attribute name="href"> 
        http://<xsl:value-of select="BackSideUrl"/>/customerlogin.asp?P=<xsl:value-of select="DynaCalPath"/></xsl:attribute > 

a

<xsl:attribute name="href">http://<xsl:value-of select="BackSideUrl"/>/customerlogin.asp?P=<xsl:value-of select="DynaCalPath"/></xsl:attribute > 
1

El número de espacios en el partido de salida exactamente el número de espacios antes de http... en usted xslt. Elimine esos y la nueva línea, y debería estar bien.

2

El espacio en blanco se conserva al mezclar texto y nodos de elemento. Así que una solución es evitar los espacios en blanco para empezar (como se muestra por Bart), o para hacer lo siguiente, que puede ser más fácil de leer, ya que se formatea así:

<xsl:attribute name="href"> 
    <xsl:text>http://</xsl:text> 
    <xsl:value-of select="BackSideUrl"/> 
    <xsl:text>/customerlogin.asp?P=</xsl:text> 
    <xsl:value-of select="DynaCalPath"/> 
</xsl:attribute > 
+0

"El espacio en blanco se conserva cuando mezclas texto y nodos de elementos ". Creo que sé a qué te refieres, pero no creo que esta afirmación sea verdadera como está escrita. Por el contrario, el espacio en blanco se conserva cuando (entre otros momentos) está en el mismo nodo de texto con texto que no es de espacio en blanco, es decir, el espacio en blanco y el espacio en blanco están juntos sin etiquetas de inicio o fin intermedias. Y lo último a menudo ocurre cuando mezclas texto y elementos como hermanos, pero no necesariamente, y no solo entonces. – LarsH

+0

@LarsH, tienes razón, es una gran simplificación.El problema es que el formateador de Visual Studio parece ignorar esto en el caso descrito y felizmente inserta saltos de línea donde de hecho son significativos. Por lo tanto, si sigue la regla de no mezclar texto y elementos como contenido (es decir, hacer que todos los elementos contengan solo texto o elementos con espacios en blanco opcionales, pero no ambos), el formateador no romperá sus documentos. Esa es la razón por la que escribí esta simplificación: debería ayudar a evitar que se rompan documentos. – Lucero

6

Sólo tiene que utilizar:

<a href="http://{BackSideUrl}/customerlogin.asp?P={DynaCalPath}"> 
      Login to View History of This Request 
</a> 

Esto (uso de AVT - Plantillas de valor de atributo) es más corto y más legible.

La razón para el comportamiento reportado, tal como se explica en casi todas las respuestas, es que el valor del atributo href se construye (en parte) a partir del texto del nodo que contiene el carácter NL.

Tales problemas son resultado de un fenómeno psicológico puramente humana: vemos claramente la Nacional cada vez que está rodeado por la no-espacio en blanco, sin embargo estamos NL-ciego cada vez que la NL se encuentra al principio o en el fin de un bloque de texto. Sería una característica útil de cualquier IDE XSLT/XML mostrar grupos solicitados de caracteres "invisibles" especiales, como NL y CR.

+0

Tienes razón, esa es probablemente la mejor solución aquí. Pero no explicó * por qué * esto sucede, y esto fue explícitamente parte de la pregunta. ;-) – Lucero

+0

@Lucero: todas las demás personas explicaron por qué sucedió esto: no veo la necesidad de repetir sus explicaciones. :) –

+0

@Lucero: se agregó una breve explicación a la respuesta. –

Cuestiones relacionadas