Whitespace in <xsl:attribute> tags

Discussion in 'XML' started by John Gordon, Jul 2, 2008.

  1. John Gordon

    John Gordon Guest

    My XSLT files have many occurrences of this general pattern:

    <a>
    <xsl:attribute name="href">
    <xsl:value-of select="xyz" />
    </xsl:attribute>
    </a>

    When I execute an XSL transform, the resulting HTML looks like this:

    <a href="xyz%0A%09%09">

    .... because *everything* between the opening and closing attribute tags
    is being included, even the carriage return after the opening attribute
    tag and the tabs before the value-of tag.

    Is there a way to avoid this behavior? I tried adding
    <xsl:strip-space elements="*"/> at the top of the file, but it appeared to
    have no effect.

    --
    John Gordon A is for Amy, who fell down the stairs
    B is for Basil, assaulted by bears
    -- Edward Gorey, "The Gashlycrumb Tinies"
     
    John Gordon, Jul 2, 2008
    #1
    1. Advertising

  2. John Gordon wrote:
    > My XSLT files have many occurrences of this general pattern:
    >
    > <a>
    > <xsl:attribute name="href">
    > <xsl:value-of select="xyz" />
    > </xsl:attribute>
    > </a>
    >
    > When I execute an XSL transform, the resulting HTML looks like this:
    >
    > <a href="xyz%0A%09%09">
    >
    > ... because *everything* between the opening and closing attribute tags
    > is being included, even the carriage return after the opening attribute
    > tag and the tabs before the value-of tag.
    >
    > Is there a way to avoid this behavior? I tried adding
    > <xsl:strip-space elements="*"/> at the top of the file, but it appeared to
    > have no effect.


    Which XSLT processor are you using?
    For the stylesheet itself (see http://www.w3.org/TR/xslt#strip) "the set
    of whitespace-preserving element names consists of just xsl:text" so the
    white space between those xsl element should not result in white space
    in the result tree.

    Obviously the snippet you posted can be reduced to
    <a href="{xyz}">
    </a>
    using an literal result element and an attribute value template but what
    you have should not result in whitespace problems.

    Are you sure the whitespace and the escaping does not result from
    evaluating xyz and applying HTML href escaping?




    --

    Martin Honnen
    http://JavaScript.FAQTs.com/
     
    Martin Honnen, Jul 2, 2008
    #2
    1. Advertising

  3. In article <g4gae4$66m$>,
    John Gordon <> wrote:

    >My XSLT files have many occurrences of this general pattern:
    >
    ><a>
    > <xsl:attribute name="href">
    > <xsl:value-of select="xyz" />
    > </xsl:attribute>
    ></a>
    >
    >When I execute an XSL transform, the resulting HTML looks like this:
    >
    ><a href="xyz%0A%09%09">


    Do you have xml:space="preserve" on some ancestor of the <xsl:attribute>
    element?

    -- Richard
    --
    Please remember to mention me / in tapes you leave behind.
     
    Richard Tobin, Jul 2, 2008
    #3
  4. John Gordon

    John Gordon Guest

    In <486bb4f6$0$6607$-online.net> Martin Honnen <> writes:

    > Which XSLT processor are you using?


    I'm using the libxslt package in python.

    > Obviously the snippet you posted can be reduced to
    > <a href="{xyz}">
    > </a>


    Yes, I've changed to this shorthand method and it has helped.

    > Are you sure the whitespace and the escaping does not result from
    > evaluating xyz and applying HTML href escaping?


    I thought it might be an href escaping issue, but then I noticed the
    same thing happening when I was setting a variable and then using the
    value in a hidden form input element, like so:

    <xsl:variable name="actionType">
    <xsl:choose>
    <xsl:when test="something">
    someValue
    </xsl:when>
    <xsl:eek:therwise>
    someOtherValue
    </xsl:eek:therwise>
    </xsl:choose>
    </xsl:variable>

    ....

    <form>
    <input type="hidden" name="actionType">
    <xsl:attribute name="value">
    <xsl:value-of select="$actionType" />
    </xsl:attribute>
    </input>
    </form>

    The value of the form element contained the embedded newline and tabs.
    When I changed the hidden form element to use the shorthand {} notation
    the problem still persisted; it was only fixed by editing the variable
    declaration and removing all the whitespace between the beginning and
    ending <xsl:when> and <xsl:eek:therwise> tags, like so:

    <xsl:variable name="actionType">
    <xsl:choose>
    <xsl:when test="something">someValue</xsl:when>
    <xsl:eek:therwise>someOtherValue</xsl:eek:therwise>
    </xsl:choose>
    </xsl:variable>

    --
    John Gordon A is for Amy, who fell down the stairs
    B is for Basil, assaulted by bears
    -- Edward Gorey, "The Gashlycrumb Tinies"
     
    John Gordon, Jul 2, 2008
    #4
  5. John Gordon

    John Gordon Guest

    In <g4gn68$17tt$> (Richard Tobin) writes:

    > >My XSLT files have many occurrences of this general pattern:
    > >
    > ><a>
    > > <xsl:attribute name="href">
    > > <xsl:value-of select="xyz" />
    > > </xsl:attribute>
    > ></a>
    > >
    > >When I execute an XSL transform, the resulting HTML looks like this:
    > >
    > ><a href="xyz%0A%09%09">


    > Do you have xml:space="preserve" on some ancestor of the <xsl:attribute>
    > element?


    No, not that I know of. (I inherited this project from someone else; it's
    possible that such an element is present and I'm just not aware of it.)

    --
    John Gordon A is for Amy, who fell down the stairs
    B is for Basil, assaulted by bears
    -- Edward Gorey, "The Gashlycrumb Tinies"
     
    John Gordon, Jul 2, 2008
    #5
  6. > <xsl:when test="something">
    > someValue
    > </xsl:when>


    If someValue is literal text, the whitespace is assumed to be
    meaningful. See XML's rules regarding "whitespace in element content";
    whitespace adjacent to non-whitespace is assumed to be part of the same
    text as that non-whitespace and should be retained. Your original
    question was about

    > <input type="hidden" name="actionType">
    > <xsl:attribute name="value">
    > <xsl:value-of select="$actionType" />
    > </xsl:attribute>
    > </input>


    Here the whitespace is adjacent only to an element, and hence XSLT
    should conclude that it's just stylesheet indentation and can be
    discarded, unless you have instructed it otherwise.

    If your XSLT processor isn't giving you the expected behavior, it may be
    time to switch processors. Or to send a bug report to its authors and
    see if they can tell you what you're doing that they didn't anticipate.
     
    Joseph J. Kesselman, Jul 2, 2008
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Greg Smith
    Replies:
    35
    Views:
    3,183
    Alex Kay
    Oct 24, 2004
  2. Oli Filth
    Replies:
    9
    Views:
    3,330
    Uncle Pirate
    Jan 17, 2005
  3. Dave
    Replies:
    0
    Views:
    451
  4. Replies:
    10
    Views:
    744
    Eric Brunel
    Dec 16, 2008
  5. MRAB
    Replies:
    3
    Views:
    386
Loading...

Share This Page