Subject: RE: [xsl] Comma delimited parameters... From: "Michael Kay" <mhkay@xxxxxxxxxxxx> Date: Tue, 18 Sep 2001 18:03:57 +0100 |
You need to write a recursive named template to split the parameter string. The general structure is template name="split" param name="list" variable name="first" select="substring-before($list, ',')" variable name="rest" select="substring-after($list, ',')" (process $first) if test="$rest" call-template name="split" with-param name="list" select="$rest" /call-template /if /template Alternatively, use the saxon:tokenize() or xalan:tokenize() extension functions. Mike Kay > -----Original Message----- > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of Casadome, > Francisco Javier > Sent: 18 September 2001 15:11 > To: 'xsl-list@xxxxxxxxxxxxxxxxxxxxxx' > Subject: [xsl] Comma delimited parameters... > > > Hi all, > > I have an XSL receiving parameter that is a list of names separated by > commas, like this: > name1,name2,name3,name4,name5,name6, > (note that the last one also have a comma at the end) > > Then I have a XML file with nodes that may or may not have > these names as > childs, like this: > > <myXML> > <node1> > <name1>XXX</name1> > <name3>CCC</name3> > </node1> > <node2/> > <node3> > <name3>AAA</name3> > <name6>QQQ</name6> > </node3> > </myXML> > > What I want to do is to create a TAB-separated file with all > the names in > the parameter as the first line, like this: > > ----------------------------------- > name1 name2 name3 name4 name5 name6 > ----------------------------------- > XXX CCC > > AAA QQQ > ----------------------------------- > > This is the XSL I have right now: > > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:output method="text" omit-xml-declaration="yes" indent="no"/> > <xsl:param name="Fields"/> > > <xsl:key name="AllPossibleFields" match="Entry/*" use="name()"/> > > <xsl:template match="Entries"> > <xsl:apply-templates select="Entry/*[count(. | > key('AllPossibleFields',name())[1]) = 1]"/> > <xsl:text>
</xsl:text> > <xsl:for-each select="Entry"> > <xsl:for-each select="*"> > <xsl:if > test="contains($Fields,concat(name(),','))"> > <xsl:value-of > select="."/><xsl:text>	</xsl:text> > </xsl:if> > </xsl:for-each> > <xsl:text>
</xsl:text> > </xsl:for-each> > </xsl:template> > > <xsl:template match="*"> > <xsl:if test="contains($Fields,concat(name(),','))"> > <xsl:value-of > select="name()"/><xsl:text>	</xsl:text> > </xsl:if> > </xsl:template> > > </xsl:stylesheet> > > Here you can see that what I do is to check if the current > node plus a comma > is in the parameter list using the contains() function. I do > this because I > don't know how to split this string without using an embed VBScript. > Also, I don't get name2, name4 and name5 in the header row, > because there > isn't any node with such childs. > > Any great ideas ? > > Thanks in advance, > Frank. > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Comma delimited parameters..., Casadome, Francisco | Thread | Re: [xsl] Comma delimited parameter, cutlass |
RE: [xsl] JAXP URIResolver is being, Michael Kay | Date | RE: [xsl] in for-each apply-templat, Michael Kay |
Month |