This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RE: XML to XML


Thanks Rob, this is what I needed! You've just saved me a lot of work, so I
owe you a pint :-)

Mick


-----Oorspronkelijk bericht-----
Van: owner-xsl-list@lists.mulberrytech.com
[mailto:owner-xsl-list@lists.mulberrytech.com]Namens Rob Lugt
Verzonden: vrijdag 22 juni 2001 12:27
Aan: xsl-list@lists.mulberrytech.com
Onderwerp: Re: [xsl] XML to XML


> I want to convert the following XML:
>
> <line>One two. Testing.</line>
>
> into:
>
> <line><word>One</word> <word>two</word>. <word>Testing</word>.</line>
>
> Problem number two. I want to add an atribute to the <word> tag which
gives
> the position of the word in the line: <word wordID=" ">.
>

I think the easiest way to deal with this is to group all the characters
that you don't want a word to contain into a single character using
translate().  The result of this can be used for your tokenizing, but you
still use the original text when outputing the bits between the tokens.
It's a bit long-winded and I expect others could improve it, but this
template should do the trick:-

<xsl:template match="line">
    <line>
        <xsl:call-template name="test"/>
    </line>
</xsl:template>

<xsl:template name="test">
   <xsl:param name="text" select="."/>
   <xsl:param name="count" select="1"/>
   <xsl:variable name="x" select="translate($text, '.,', '  ')"/>

      <xsl:choose>
         <xsl:when test="contains($x, ' ')">
            <xsl:variable name="word" select="substring-before($x, ' ')"/>
            <xsl:variable name="wordlen" select="string-length($word)"/>
            <xsl:if test="$wordlen">
                <word wordID="{$count}"><xsl:value-of
select="$word"/></word>
            </xsl:if>
            <xsl:value-of select="substring($text, $wordlen+1, 1)"/>
            <xsl:call-template name="test">
                <xsl:with-param name="text" select="substring($text,
$wordlen+2)"/>
                <xsl:with-param name="count"
select="$count+boolean($wordlen)"/>
            </xsl:call-template>
         </xsl:when>
         <xsl:when test="$text">
            <word wordID="{$count}">
             <xsl:value-of select="$text"/>
            </word>
         </xsl:when>
      </xsl:choose>
</xsl:template>

Hope this helps!
~Rob

--
Rob Lugt
ElCel Technology
http://www.elcel.com/



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]