Hello to all,
I am working on XML to XML transformations and I have a problem
related to contains() function. I am providing the source XML, the
XSLT and target XML files below:
SOURCE XML
<pathway image="http://www.genome.jp/kegg/pathway/map/map00362.gif "
link="http://www.genome.jp/dbget-bin/show_pathway?map00362"
name="path:map00362" number="00362" org="map" title="Benzoate
degradation via hydroxylation">
<entry id="8" name= "ec:1.14.13.33" reaction="rn:R01296 rn:R01298"
type="enzyme" ></entry>
<entry id="9" name= "ec:1.14.13.2" reaction="rn:R01296 rn:R01298"
type="enzyme" ></entry>
<entry id="20" name= "cpd:C00156" type="compound"></entry >
<entry id="21" name= "cpd:C00230" type="compound"></entry >
<entry id="41" name= "ec:1.13.11.-" reaction="rn:R01629 rn:R01630"
type="enzyme" ></entry>
<entry id="109" name= "cpd:C02814" type="compound"></entry >
<reaction name="rn:R01296" type="reversible" >
<substrate name="cpd:C00156"></substrate >
<product name="cpd:C00230"></product >
</reaction>
<reaction name="rn:R01298" type="reversible" >
<substrate name="cpd:C00156"></substrate >
<product name="cpd:C00230"></product >
</reaction>
<reaction name="rn:R01629" type="irreversible" >
<substrate name="cpd:C00230"></substrate >
<product name="cpd:C02814"></product >
</reaction>
<reaction name="rn:R01630" type="irreversible" >
<substrate name="cpd:C00230"></substrate >
<product name="cpd:C02814"></product >
</reaction>
</pathway>
XSLT FILE
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform "
version="1.0" xmlns:sbml="http://www.sbml.org/sbml/level2 "
xmlns="http://www.sbml.org/sbml/level2" xmlns:celldesigner=
"http://www.sbml.org/2001/ns/celldesigner">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:template match="reaction">
<xsl:if test="(boolean(substrate)) and (boolean(product))">
<xsl:element name="reaction">
<xsl:attribute name="id">
<xsl:value-of select="translate(@name,'rn:','')" />
</xsl:attribute>
<xsl:attribute name="name">
<xsl:value-of select="translate(@name,'rn:','')" />
</xsl:attribute>
<xsl:choose>
<xsl:when test="@type='reversible'">
<xsl:attribute name="reversible">true </xsl:attribute>
</xsl:when>
<xsl:when test="@type='irreversible'">
<xsl:attribute name="reversible">false </xsl:attribute>
</xsl:when>
</xsl:choose>
<xsl:element name="listOfReactants">
<xsl:for-each select="substrate">
<xsl:variable name="reac" select= "@name"/>
<xsl:call-template name="SearchCompound">
<xsl:with-param name="name" select= "$reac"/>
</xsl:call-template>
</xsl:for-each>
</xsl:element>
<xsl:element name="listOfProducts">
<xsl:for-each select="product">
<xsl:variable name="prod" select= "@name"/>
<xsl:call-template name="SearchCompound">
<xsl:with-param name="name" select= "$prod"/>
</xsl:call-template>
</xsl:for-each>
</xsl:element>
<xsl:variable name="rea" select= "@name"/>
<xsl:choose>
<xsl:when test="//entry/@reaction=$rea">
<xsl:element name="listOfModifiers">
<xsl:call-template name="SearchModifier">
<xsl:with-param name="name" select= "$rea"/>
</xsl:call-template>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:if test="contains(//entry/@reaction, $rea)">
<xsl:element name="listOfModifiers">
<xsl:call-template name="SearchModifier">
<xsl:with-param name="name" select= "$rea"/>
</xsl:call-template>
</xsl:element>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template name="SearchCompound">
<xsl:param name="name"/>
<xsl:for-each select="//entry">
<xsl:variable name="entry" select= "@name"/>
<xsl:choose>
<xsl:when test="$entry=$name">
<xsl:element name="speciesReference">
<xsl:attribute name="species">
<xsl:value-of select="concat('s', @id)" />
</xsl:attribute>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<xsl:template name="SearchModifier">
<xsl:param name="name"/>
<xsl:for-each select="//entry">
<xsl:variable name="act" select="@reaction" />
<xsl:choose>
<xsl:when test="contains($act,$name)">
<xsl:element name="modifierSpeciesReference">
<xsl:attribute name="species">
<xsl:value-of select="concat('s', @id)" />
</xsl:attribute>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
TARGET XML
<reaction id="R01296" name= "R01296" reversible="true">
<listOfReactants>
<speciesReference species="s20"/>
</listOfReactants>
<listOfProducts>
<speciesReference species="s21"/>
</listOfProducts>
<listOfModifiers>
<modifierSpeciesReference species="s8"/>
<modifierSpeciesReference species="s9"/>
</listOfModifiers>
</reaction>
<reaction id="R01298" name="R01298" reversible="true">
<listOfReactants>
<speciesReference species="s20"/>
</listOfReactants>
<listOfProducts>
<speciesReference species="s21"/>
</listOfProducts>
<listOfModifiers>
<modifierSpeciesReference species="s8"/>
<modifierSpeciesReference species="s9"/>
</listOfModifiers>
</reaction>
<reaction id="R01629" name="R01629" reversible="false">
<listOfReactants>
<speciesReference species="s21"/>
</listOfReactants>
<listOfProducts>
<speciesReference species="s109"/>
</listOfProducts>
</reaction>
<reaction id="R01630" name="R01630" reversible="false">
<listOfReactants>
<speciesReference species="s21"/>
</listOfReactants>
<listOfProducts>
<speciesReference species="s109"/>
</listOfProducts>
</reaction>
The problem here is that in the last two reactions (R01629 & R01630)
there is no <listOfModifiers> node present. Responsible for the
creation of this node is the contains() call in XSLT stylesheet. While
it works for the first two reactions (R01296 & R01298) finding the
entries 8 and 9, it fails in the case of entry 41. What is wrong
here?? Maybe the Xpath query?
Thanks.
--~------------------------------------------------------------------
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>
--~--