Shawn
Shawn

Reputation: 71

XSLT why is 
 showing up in my hrefs?

I have the following XSLT

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

The result has the following:

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

Why are the &#xA; and all the spaces there? I am new to XSLT and my google searches haven't turned anything up that I understood. Thanks, Shawn

Upvotes: 7

Views: 18683

Answers (5)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243479

Just use:

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

This (use of AVT -- Attribute-Value-Templates) is both shorter and more readable.

The reason for the reported behavior, as explained in almost all answers, is that the value of the attribute href is constructed (partly) from text-node that contains the NL character.

Such issues are result from a purely human, psychological phenomenon: we clearly see the NL whenever it is surrounded by non-white-space, however we are NL-blind whenever the NL is at the start or at the end of a block of text. It would be a useful feature of any XSLT/XML IDE to show on request groups of special "invisible" characters, such as NL and CR.

Upvotes: 6

Lucero
Lucero

Reputation: 60190

The whitespace is preserved when you mix text and element nodes. So one solution is to avoid the whitespace to begin with (as shown by Bart), or to do the following, which may be more readable since it gets formatted well:

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

Upvotes: 2

bitmask
bitmask

Reputation: 34636

The number of spaces in the output match exactly the number of spaces before http... in you xslt. Remove those and the newline, and you should be fine.

Upvotes: 1

Bart van Heukelom
Bart van Heukelom

Reputation: 44104

I'm not really familiar with XSLT myself either, but as a guess from general programming experience, try changing

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

to

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

Upvotes: 1

SLaks
SLaks

Reputation: 887479

The &#A; is an encoded newline character.

It and the spaces are preserved from the newline and spaces in your XSLT.

Upvotes: 8

Related Questions