469,282 Members | 1,924 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,282 developers. It's quick & easy.

Applying XSL templates dynamically

Folks,

I have a XML document that has been put together from a "dynamic part"
(generated somehow during runtime) and a "static part" (read from a
control file). Basically the document looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<rootelement>
<subelementName>subelementTwo</subelementName>
<subelements>
<subelementOne>
<value>one</value>
</subelementOne>
<subelementTwo>
<value>foo</value>
<anotherValue/>
</subelementTwo>
</subelements>
</rootelement>

Here the dynamic part is the content of the <subelementName> element,
while the subelements come from the control file.

Now I would want to have the dynamic part of the document to control
the transformation, i.e. i am only interrested of the subelement which
name equals the content of the <subelementName> element.

I think i can achieve this by the following xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes"/>
<xsl:template match="/rootelement">
<resultroot>
<xsl:apply-templates select="subelements/*">
<xsl:with-param name="subelementName">
<xsl:value-of select="subelementName"/>
</xsl:with-param>
</xsl:apply-templates>
</resultroot>
</xsl:template>
<xsl:template match="subelementOne">
<xsl:param name="subelementName"/>
<xsl:if test="name(.) = $subelementName">
<!-- do something -->
</xsl:if>
</xsl:template>
<xsl:template match="subelementTwo">
<xsl:param name="subelementName"/>
<xsl:if test="name(.) = $subelementName">
<!-- do something else-->
</xsl:if>
</xsl:template>
</xsl:stylesheet>
However, I would like to "limit the templates applied" instead of
apply them all and then try to figure out in each of them wheter the
template should provide something to the output or not (imagine, if we
had thousands of these templates).

So I quess I have these questions:

1.
How can i have the <xsl:apply-templates> to select only the node-set
that match to the content of an element (here: subelementName)

2.
Is there another, preferred way of doing this thing - am i looking at
wrong direction here?

Appreciate Your views on this,

<kimmo/>
Jul 20 '05 #1
2 1954


Kimmo wrote:

Basically the document looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<rootelement>
<subelementName>subelementTwo</subelementName>
<subelements>
<subelementOne>
<value>one</value>
</subelementOne>
<subelementTwo>
<value>foo</value>
<anotherValue/>
</subelementTwo>
</subelements>
</rootelement>

Now I would want to have the dynamic part of the document to control
the transformation, i.e. i am only interrested of the subelement which
name equals the content of the <subelementName> element.

I think i can achieve this by the following xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes"/>
<xsl:template match="/rootelement">
<resultroot>
<xsl:apply-templates select="subelements/*">
<xsl:with-param name="subelementName">
<xsl:value-of select="subelementName"/>
</xsl:with-param>
</xsl:apply-templates>
</resultroot>
</xsl:template>
<xsl:template match="subelementOne">
<xsl:param name="subelementName"/>
<xsl:if test="name(.) = $subelementName">
<!-- do something -->
</xsl:if>
</xsl:template>
<xsl:template match="subelementTwo">
<xsl:param name="subelementName"/>
<xsl:if test="name(.) = $subelementName">
<!-- do something else-->
</xsl:if>
</xsl:template>
</xsl:stylesheet>
However, I would like to "limit the templates applied" instead of
apply them all and then try to figure out in each of them wheter the
template should provide something to the output or not (imagine, if we
had thousands of these templates).

So I quess I have these questions:

1.
How can i have the <xsl:apply-templates> to select only the node-set
that match to the content of an element (here: subelementName)


Why can't you make the check you have later already in apply-templates,
somehow alike
<xsl:apply-templates select="subelements/*[local-name() =
current()/subelementName]" />
that should do (even if my attempt above might need some adjusting).


--

Martin Honnen
http://JavaScript.FAQTs.com/

Jul 20 '05 #2
Martin Honnen <ma*******@yahoo.de> wrote in message news:<40********@olaf.komtel.net>...
So I quess I have these questions:

1.
How can i have the <xsl:apply-templates> to select only the node-set
that match to the content of an element (here: subelementName)


Why can't you make the check you have later already in apply-templates,
somehow alike
<xsl:apply-templates select="subelements/*[local-name() =
current()/subelementName]" />
that should do (even if my attempt above might need some adjusting).


Martin, exactly. Thanks.

My question was "how", You did show me "how" although You answered
with a question "why". It is easy to answer to that question (of
Yours): there is no reason at all why I wouldn't do it the way You
suggested - other than that I was clumsy and sloppy with the
expression in the square brackets. I tried and i tried and i read more
of Jeni Tennison's book and tried again, but no success. Of course now
it looks self-evident and Your suggestion was basically exactly what I
was looking for.

Thanks again.

<kimmo/>
Jul 20 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by Thomas Sommer | last post: by
1 post views Thread by Ben R. | last post: by
3 posts views Thread by Christoph | last post: by
reply views Thread by Craig Buchanan | last post: by
2 posts views Thread by Hvid Hat | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by zhoujie | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.