CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 5 of 5
  1. #1
    Join Date
    Jun 2002
    Posts
    137

    Question xsl:variable with attribute

    Hi,
    I want to use the xsl:varriable in the <xsl:template match="">
    the following is what I tried with <xsl:apply-templates select="">

    the xsl file:

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="PLANETS">
    <HTML>
    <xsl:apply-templates/>
    </HTML>
    </xsl:template>
    <xsl:template match="//PLANETS/PLANET">
    <h2>the <xsl:value-of select="NAME"/> is <xsl:value-of
    select="$pcolor"/></h2>
    </xsl:template>
    <xsl:variable name="pcolor"/>
    <xsl:template match="xref">
    <xsl:variable name="pcolor" select="@linkend"/>
    <xsl:apply-templates select="//PLANETS/*[@COLOR=$pcolor]"/>
    </xsl:template>
    <xsl:template match="text()">
    </xsl:template>
    </xsl:stylesheet>

    the xml file:
    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xml" href="planets.xsl"?><PLANETS>
    <xref linkend="RED"/>
    <PLANET COLOR="RED">
    <NAME>Mercury</NAME>
    <MASS UNITS="(Earth = 1)">.0553</MASS>
    <DAY UNITS="days">58.65</DAY>
    </PLANET>
    </PLANETS>

    I explicitly declare the xsl:variable pcolor at the global scope too otherwise the xsl will report error with pcolor not declared before useing it in

    <xsl:template match="//PLANETS/PLANET">
    <h2>the <xsl:value-of select="NAME"/> is <xsl:value-of
    select="$pcolor"/></h2>
    </xsl:template>

    the problem with the previous example is that the variable pcolor can not be assigned with value RED and passed to "<h2>the <xsl:value-of select="NAME"/> is <xsl:value-of select="$pcolor"/></h2>". if I can define a variable pcolor equal to RED and use

    <xsl:template match="//PLANETS/PLANET[@COLOR='{$pcolor}']">
    <h2>the <xsl:value-of select="NAME"/> is <xsl:value-of
    select="$pcolor"/></h2>
    </xsl:template>
    there is no above problems.

    Anybody can give the solutions?
    Thanks in advance!
    Best Regards!

  2. #2
    Join Date
    Aug 2001
    Location
    Russia, Moscow
    Posts
    26
    Hi

    <xsl:template match="someNode">
    <xslaram name="parName"/>
    ........
    <xsl:value-of select="$parName"/>
    .......
    </xsl:template>


    inside another template
    ....
    <xsl:apply-templates select="//someNode">
    <xsl:with-param name="parName">whatever you want, for example-<xsl:value-of select="someXPath"/></xsl:with-param>
    </xsl:apply-templates>
    ....
    Good luck

  3. #3
    Join Date
    Jun 2002
    Posts
    137

    thanks but it doesnot work

    I am using the xml spy to do the conversion. the way you suggested didnot work in my pc. Can you give me the entire xsl? and you suggested is to use xslaram
    is there the solution for xsl:variable?

  4. #4
    Join Date
    Aug 2001
    Location
    Russia, Moscow
    Posts
    26
    Sorry I did not catch in the begining what do you really need.
    Try this sample. I think you have expected this:

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xml" href="x.xsl"?>
    <PLANETS>
    <xref code="R" colorName="RED"/>
    <PLANET COLOR="R">
    <NAME>Mercury</NAME>
    <MASS UNITS="(Earth = 1)">.0553</MASS>
    <DAY UNITS="days">58.65</DAY>
    </PLANET>
    </PLANETS>



    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <HTML>
    <xsl:apply-templates select="//PLANETS/PLANET"/>
    </HTML>
    </xsl:template>

    <xsl:template match="PLANET">
    <xsl:variable name="var" select="@COLOR"/>
    <h2>the <xsl:value-of select="NAME"/> is <xsl:value-of select="//xref[@code=$var]/@colorName"/>
    </h2>
    </xsl:template>
    </xsl:stylesheet>


    Good luck

  5. #5
    Join Date
    Jun 2002
    Posts
    137

    Talking thanks a lot

    I modified your code and it works as the results here:
    the Mercury is RED
    the Venus is RED
    thanks a lot for your help. Think that the xsl:variable is not be able to use like
    <xsl:template match="PLANET[@COLOR='$RED_COLOR']">
    <h2>the <xsl:value-of select="NAME"/> is <xsl:value-of select="$RED_COLOR"/>
    </h2>
    </xsl:templte>
    so that the xsl:if is not need to be used. and the <xref>in the xml is not needed.
    by the way use PLANET[@COLOR='$RED_COLOR'] is not a error, just the match is not correct. maybe xsl treats the $RED_COLOR as a whole string not a string value of a variable
    thanks again

    the xsl code:
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
    <HTML>
    <xsl:apply-templates select="//PLANETS/PLANET"/>
    </HTML>
    </xsl:template>

    <xsl:template match="PLANET">
    <xsl:variable name="var" select="//PLANETS/PLANET/@COLOR"/>
    <xsl:variable name="var2" select="//PLANETS/xref/@linkend"/>
    <xsl:if test="$var=$var2">
    <h2>the <xsl:value-of select="NAME"/> is <xsl:value-of select="//xref[@linkend=$var]/@linkend"/>
    </h2>
    </xsl:if>
    </xsl:template>
    </xsl:stylesheet>


    xml code
    <?xml version="1.0"?>
    <!-- edited with XML Spy v4.1 U (http://www.xmlspy.com) by zou xiong (tempcompany) -->
    <?xml-stylesheet type="text/xsl" href="E:\XML-XSL-XSLT\planets.xsl"?>
    <PLANETS>
    <PLANET COLOR="RED">
    <NAME>Mercury</NAME>
    <MASS UNITS="(Earth = 1)">.0553</MASS>
    <DAY UNITS="days">58.65</DAY>
    <RADIUS UNITS="miles">1516</RADIUS>
    <DENSITY UNITS="(Earth = 1)">.983</DENSITY>
    <DISTANCE UNITS="million miles">43.4</DISTANCE>
    <!--At perihelion-->
    </PLANET>
    <PLANET COLOR="RED">
    <NAME>Venus</NAME>
    <MASS UNITS="(Earth = 1)">.815</MASS>
    <DAY UNITS="days">116.75</DAY>
    <RADIUS UNITS="miles">3716</RADIUS>
    <DENSITY UNITS="(Earth = 1)">.943</DENSITY>
    <DISTANCE UNITS="million miles">66.8</DISTANCE>
    <!--At perihelion-->
    </PLANET>
    <PLANET COLOR="BLUE">
    <NAME>Earth</NAME>
    <MASS UNITS="(Earth = 1)">1</MASS>
    <DAY UNITS="days">1</DAY>
    <RADIUS UNITS="miles">2107</RADIUS>
    <DENSITY UNITS="(Earth = 1)">1</DENSITY>
    <DISTANCE UNITS="million miles">128.4</DISTANCE>
    <!--At perihelion-->
    </PLANET>
    <xref linkend="RED"/>
    </PLANETS>

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured