[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] xsl split string


Subject: RE: [xsl] xsl split string
From: "Philippe LAPLANCHE" <philippe.laplanche@xxxxxxxxxxxx>
Date: Sun, 11 Dec 2005 22:36:01 +0100

If found a solution but I'm not 100% satisfied. My solution uses a template to
split the "fields" attribute. The problem is that the template is called a lot
of times and if I have many <update> nodes then it will take a lot of time. Is
there a nicer solution?

Here's my stylesheet :

	<xsl:template match="/root">
		<page>
			<xsl:apply-templates select="*"/>
		</page>
	</xsl:template>

	<xsl:template match="update">
		<sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0">
			<sql:query>
				UPDATE <xsl:value-of select="$table"/>
				SET <xsl:apply-templates select="@*[not(name()='xk' or name()='xi')]"
mode="update"/>
				WHERE <xsl:apply-templates select="@xk" mode="update"/>
			</sql:query>
		</sql:execute-query>
	</xsl:template>

	<xsl:template match="@xk" mode="update">`UID` = '<xsl:value-of
select="."/>'</xsl:template>

	<xsl:template match="@*" mode="update">`<xsl:call-template name="split">
			<xsl:with-param name="string" select="/root/@fields"/>
			<xsl:with-param name="position" select="position()"/>
		</xsl:call-template>` = <xsl:call-template name="stringOrNULL">
			<xsl:with-param name="string" select="."/>
		</xsl:call-template> <xsl:if test="not(position()=last())">,</xsl:if>
	</xsl:template>

	<xsl:template name="split">
		<xsl:param name="string"/>
        <xsl:param name="position"/>
        <xsl:choose>
			<xsl:when test="$position=1">
				<xsl:if test="contains($string, '|')"><xsl:value-of
select="substring-before($string,'|')"/></xsl:if>
				<xsl:if test="not(contains($string, '|'))"><xsl:value-of
select="$string"/></xsl:if>
			</xsl:when>
			<xsl:otherwise>
				<xsl:call-template name="split">
					<xsl:with-param name="string" select="substring-after($string,'|')"/>
					<xsl:with-param name="position" select="$position - 1"/>
				</xsl:call-template>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template name="stringOrNULL">
		<xsl:param name="string"/>
		<xsl:if test="$string=''">NULL</xsl:if>
		<xsl:if test="not($string='')">'<xsl:value-of select="$string"/>'</xsl:if>
	</xsl:template>

Philippe


-----Message d'origine-----
De : Philippe LAPLANCHE
Envoyi : dimanche 11 dicembre 2005 21:31
@ : xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Objet : [xsl] xsl split string

Hi

I have to transform this "compressed" xml :

<root fields="CHP-CODE|CHP-TABLE|CHP-LIBELLE">
         <update xi="5" xk="5" a="CHP-ORDRE" b="champs" c="Ordre"/>
</root>


Into this :

<page>
	<sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0">
		<sql:querry>
			UPDATE `config`
				SET `CHP-CODE`='CHP-ORDRE',
				    `CHP-TABLE`='champs',
				    `CHP-LIBELLE`='Ordre'
				WHERE UID='5'
		</sql:querry>
	</sql:execute-query>
</page>

My problem is that I don't know how to extract CHP-CODE, CHP-TABLE and
CHP-LIBELLE from the fields attribute of the root node. I have to do something
generic that would work if the fields attribute is longer.

For now I have this stylesheet. I just don't know how to complete the part
where I put ......

	<xsl:template match="/root">
		<page>
			<xsl:apply-templates select="*"/>
		</page>
	</xsl:template>

	<xsl:template match="update">
		<sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0">
			<sql:query>
				UPDATE `config`
				SET <xsl:apply-templates select="@*[not(name()='xk' or name()='xi')]"
mode="update"/>
				WHERE <xsl:apply-templates select="@xk" mode="update"/>
			</sql:query>
		</sql:execute-query>
	</xsl:template>

	<xsl:template match="@*" mode="update">
		`..........` = '<xsl:value-of select="."/>' <xsl:if
test="not(position()=last())">,</xsl:if>
	</xsl:template>


Philippe

-----------------------------------------------------------------------------
----------
Wanadoo vous informe que cet  e-mail a ete controle par l'anti-virus mail.
Aucun virus connu a ce jour par nos services n'a ete detecte.


Current Thread
Keywords