Parsing comma-separated values with XSL?

R

RogerTBrick

Cheers for the help last time guys. Again this is probably dead
simple but try as I might, I just can't work it out.

THe XML file I am being give contains some code value that need to be
exchanged for text in the final output (to HTML as it happens).
<root>
<thingy code="2"/>
<root>

My first solution (the one I thought would be easiest) was you use two
comma spearated lists and simply grab the correct text value based on
the index.
<xsl:variable name="codes">1,2,3,4</xsl:variable>
<xsl:variable name="text">aaa,bbb,ccc,ddd</xsl:variable>

But I am stumped. Is this even possible with XSL? Or is there a
better way of doing the substitution that I'm missing?

Thanks again,

J.
 
M

Martin Honnen

RogerTBrick wrote:

THe XML file I am being give contains some code value that need to be
exchanged for text in the final output (to HTML as it happens).
<root>
<thingy code="2"/>
<root>

My first solution (the one I thought would be easiest) was you use two
comma spearated lists and simply grab the correct text value based on
the index.
<xsl:variable name="codes">1,2,3,4</xsl:variable>
<xsl:variable name="text">aaa,bbb,ccc,ddd</xsl:variable>

But I am stumped. Is this even possible with XSL? Or is there a
better way of doing the substitution that I'm missing?

You can build a map in the XSLT stylesheet using elements in a separate
namespace and access it as follows

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:mp="http://example.com/2005/03/map1">

<xsl:param name="searchKey" select="1" />

<map xmlns="http://example.com/2005/03/map1">
<item>
<key>1</key>
<value>aaa</value>
</item>
<item>
<key>2</key>
<value>bbb</value>
</item>
</map>

<xsl:template match="/">
<result>
<xsl:value-of
select="document('')/xsl:stylesheet/mp:map/mp:item[mp:key =
$searchKey]/mp:value" />
</result>
</xsl:template>

</xsl:stylesheet>
 
D

David Carlisle

But I am stumped. Is this even possible with XSL?

yes but string handling isn't xslt1's strong point, It's rather better
at handling xml structure.

I'd stick

<things>
<text>aaa</text>
<text>bbb</text>
<text>ccc</text>
</things>

in things.xml then do

<xsl:template match="thingy">
<xsl:copy-of
select="document('things.xml')/
things/text[position()=current()/@code]/node()"/>
</xsl:template>

or if your codes don't allways go 1 2 3

I'd stick
<things>
<text code="x">aaa</text>
<text code="y">bbb</text>
<text code="z">ccc</text>
</things>

in things.xml then do

<xsl:template match="thingy">
<xsl:copy-of
select="document('things.xml')/
things/text[@code=current()/@code]/node()"/>
</xsl:template>

so as to extract on the code attribute not on position.

If your list is long you could use a key to speed up searching for the
right replacement.

David
 
R

RogerTBrick

David Carlisle said:
yes but string handling isn't xslt1's strong point, It's rather better
at handling xml structure.

I'd stick

<things>
<text>aaa</text>
<text>bbb</text>
<text>ccc</text>
</things>
Ooo, you've no idea how much I wish I could do that. Thanks for the
help guys, I knew it was a filthy hack when I started, but needs must
and all that.

J.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,999
Messages
2,570,246
Members
46,839
Latest member
MartinaBur

Latest Threads

Top