xsl-list
[Top] [All Lists]

[xsl] Applying contains() to multiple nodes problem

2007-10-04 05:38:09
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>
--~--

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