xsl-list
[Top] [All Lists]

Re: [xsl] Converting SSI variables to XML

2006-09-11 08:49:59
Hi Tom,

Looking at your data, I'd recommend one of two approaches:

1. Make the conversion a two step process. You CDATA section closely resembles something that looks like XML to me, turning it into XML will give you a document that you can process more easily in the second step. This seems to be the approach you took.

2. Using the regular expression approach, you can turn the CDATA section into a node-set and traverse over the contents of this node-set using normal XSLT. This is a one-pass approach (meaning: it will need only one xslt processing call) and I normally use it that way.

On your problem with getting the number out. It appears as if it always has something *without* a dot at the end and the number itself will consist of only numbers. The easiest (?) way to extract the number is using replace() function:

<xsl:value-of select="replace ( @name , '^.*\.([0-9]+)\.[^.]+$', '$1' ) " />

In human language this says:
^.+      from the start of the string, one or more chars
\.       then a dot
([0-9]+) grab one or more digits and place it in $1
\.       followed by a dot
[^.]+    followed by one ore more non-dots
$        till the end of the string

'$1' replaces the whole string between the anchors ^ and $ with the number.

Hope this helps,

Cheers,
Abel Braaksma
http://abelleba.metacarpus.com




tom tom wrote:
Hi all, I wish to turn the following CDATA input:

<xml>

   <![CDATA[

<!--#set var="t.news.1.title" value="This is the title"-->
<!--#set var="t.news.1.image_small" value="smallimage"-->
<!--#set var="t.news.1.image_large" value="largeimage"-->

<!--#set var="t.news.2.title" value=""-->
<!--#set var="t.news.2.image_small" value=""-->
<!--#set var="t.news.2.image_large" value=""-->

<!--#set var="t.news.3.title" value=""-->
<!--#set var="t.news.3.image_small" value=""-->
<!--#set var="t.news.3.image_large" value=""-->


]]>
   </xml>


Into XML as follows using XSLT 2:

<ts>
 <group num="1">
  <var name="t.news.1.title" value="This is the title"/>
  <var name="t.news.1.image_small" value="smallimage"/>
  <var name="t.news.1.image_large" value="largeimage"/>
 </group>
 <group num="2">
  etc.....
 </group>
</ts>

I have used the analyze-string function to do a regex match on the HTML comments, it then extracts the values of 'var' and 'value' to create:

<ts>

  <var name="t.news.1.title" value="This is the title"/>
  <var name="t.news.1.image_small" value="smallimage"/>
  <var name="t.news.1.image_large" value="largeimage"/>


  etc.....

</ts>

To add the grouping I will need to do another pass over this data however I am finding it complex to extract the numerical data from the string at @name and it seems unnecessary complex. I have also tried nesting xsl:analyze-string elements to create a group first then the individual variables. Can anyone recommend the correct way to do this?

Thanks in advance

Tom

_________________________________________________________________
Download the new Windows Live Toolbar, including Desktop search! http://toolbar.live.com/?mkt=en-gb


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--





--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>