Reputation: 71
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="
 http://dotnet.dynacal.com/customerlogin.asp?P=DEMO8">
Login to View History of This Request
</a>
Why are the 

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