|
Subject: Re: [xsl] I output a tab character, then the output file contains space, tab, space ... why? From: "Eliot Kimber ekimber@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 8 Apr 2016 17:51:55 -0000 |
In your second problem solution I would use a FLOWR statement to construct
the value rather than using for-each:
<xsl:variable name="result" as="xs:string*"
select="for $item in $foo
Return f:compute-value($item)"
/>
<xsl:sequence select="result"/>
And of course you could do the string-join there as well.
As far as I can tell the only reason to really need to use for-each in
XSLT 2 is to make something the current context where you then need to do
instructions that operate only on the current context (meaning you can't
just put the thing in a variable and the process that). And off the top of
my head I can't think of what that might be although I've had to do it
recently for something.
In functions I always use the result/sequence pattern simply to make it
easy to report the result before returning it should I need to debug the
function's behavior.
Cheers,
E.
----
Eliot Kimber, Owner
Contrext, LLC
http://contrext.com
On 4/8/16, 12:34 PM, "Costello, Roger L. costello@xxxxxxxxx"
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>Hi Folks,
>
>Thank you very much Martin, Michael, and Eliot. Simply superb.
>
>Below I summarize the problem and the solution.
>
>-----------------------------
>Problem Statement:
>-----------------------------
>
>The below XSLT program loops over each value in a sequence and separates
>the sequence values by a tab (hex 9) character. When the output file is
>opened in a hex editor we see 3 characters separating the sequence
>values:
>
> space (hex 20), tab (hex 9), and space (hex 20)
>
>Problem: How can we avoid getting space characters surrounding the tab?
>
><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="2.0">
>
> <xsl:output method="text" />
>
> <xsl:variable name="headers" select="('A', 'B')"/>
> <xsl:variable name="field-separator"
>select="codepoints-to-string(9)"/>
>
> <xsl:template match="/">
> <xsl:for-each select="$headers">
> <xsl:sequence select="." />
> <xsl:sequence select="$field-separator"/>
> </xsl:for-each>
> </xsl:template>
>
></xsl:stylesheet>
>
>--------------
>Solution:
>--------------
>
>The following value-of element will generate the desired output, without
>space (hex 20) characters surrounding the tab (hex A) character:
>
> <xsl:value-of select="$headers" separator="{$field-separator}"/>
>
>Here is an alternate (equivalent) solution which uses XPath to solve the
>problem:
>
> <xsl:sequence select="string-join($headers, $field-separator)"/>
>
>------------------
>Problem #2:
>------------------
>
>Unlike the above case, in this case there is not a predetermined sequence
>of values to be output. Rather, the sequence of values to be output are
>determined at run-time. We need to loop over some values, compute an
>appropriate value to output, and then follow the output value with a tab
>(hex 9). Like this:
>
><xsl:for-each select="foo">
> <xsl:variable name="value" select="f:compute-value(.)"/>
> <xsl:sequence select="$value" />
> <xsl:sequence select="$field-separator"/>
></xsl:for-each>
>
>Problem: How can we output a tab (hex 9) without also getting the space
>(hex 20) characters surrounding the tab character?
>
>--------------
>Solution:
>--------------
>
>Replace the above loop with this value-of element:
>
> <xsl:value-of select="f:get-sequence($foo)"
>separator="{$field-separator}"/>
>
>Create a function which returns just the sequence of values (no field
>separators):
>
><xsl:function name="f:get-sequence" as="xs:string*">
> <xsl:param name="foo" />
>
> <xsl:for-each select="foo">
> <xsl:variable name="value" select="f:compute-value(.)"/>
> <xsl:sequence select="$value" />
> </xsl:for-each>
>
></xsl:function>
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] I output a tab character,, Michael Kay mike@xxx | Thread | [xsl] XSLT / XPath / XML Training, Dimitre Novatchev dn |
| Re: [xsl] I output a tab character,, Michael Kay mike@xxx | Date | [xsl] XSLT / XPath / XML Training, Dimitre Novatchev dn |
| Month |