Hello,

I'd like to reference elements whose names (paths) are not known
statically but are stored in the XML document. I have following XML:

        <?xml version="1.0" encoding="ISO-8859-2"?>
        <page>
                <result>
                        <person>Tom</person>
                        <id>13</id>
                </result>
                <structure>
                        <tag name="person"/>
                        <tag name="id"/>
                </structure>
        </page>

and I'm aiming for the output

        <output>
                <newtag name="person" value="Tom"/>
                <newtag name="id" value="13"/>
        </output>

so if the /page/structure/tag/@name is person, the value of th nwatag
should be /page/result/person. I tried

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

        <xsl:template match="page">
        <output>
                <xsl:apply-templates select="structure"/>
        </output>
        </xsl:template>

        <xsl:template match="structure/tag">
                <newtag>
                <xsl:attribute name="name">
                        <xsl:value-of select="@name"/>
                </xsl:attribute>
                <xsl:attribute name="value">
                        <xsl:value-of select="/page/result/{@name}"/>
                </xsl:attribute>
                </newtag>
        </xsl:template>

        </xsl:stylesheet>

but received [Sablotron] [215] Error: msgtype:error ::
code:215 :: module:Sablotron :: URI:arg:/template :: line:16 ::
node:attribute 'select' :: msg:token '{' not recognized
(this is in XML::Sablotron under AxKit but I assume it doesn't
matter).

Jirka Kosek suggested using

         <xsl:template match="structure/tag">
                 <xsl:variable name="name" select="@name"/>
                 <newtag>
                 <xsl:attribute name="name">
                         <xsl:value-of select="$name"/>
                 </xsl:attribute>
                 <xsl:attribute name="value">
                         <xsl:value-of select="/page/result/$name"/>
                 </xsl:attribute>
                 </newtag>
         </xsl:template>

but here I get [Sablotron] [214] Error: msgtype:error :: code:214 ::
module:Sablotron :: URI:arg:/template :: line:17 :: node:attribute
'select' :: msg:pattern is empty
(line 17 that containing <xsl:value-of select="/page/result/$name"/>).

So my question is: is this possible with Sablotron? Using data from
XML to dynamically with the target of the template of the path of the
element? Or any other workaround?

Any hint would be helpful,

-- 
------------------------------------------------------------------------
 Honza Pazdziora | [EMAIL PROTECTED] | http://www.fi.muni.cz/~adelton/
 .project: Perl, mod_perl, DBI, Oracle, auth. WWW servers, XML/XSL, ...
------------------------------------------------------------------------

Reply via email to