473,398 Members | 2,212 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,398 software developers and data experts.

Help with XSL

Hi,
I have an XSL here...and though I understand XML, I am having a hard time
understanding what this XSL does?
Any help will be appreciated.
TIA

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="pageKey" match="//HierarchyMember" use="@PageKey"/>
<xsl:template match="/">
<Root>
<xsl:apply-templates select="//HierarchyMember"/>
</Root>
</xsl:template>
<xsl:template match="HierarchyMember">
<xsl:if test="count(key('pageKey', @PageKey)) > 1">
<xsl:copy>
<xsl:attribute
name="PageKey"><xsl:value-of-select="@PageKey"/></xsl:attribute>
<xsl:attribute name="Count"><xsl:value-of
select="count(key('pageKey',@PageKey))"/></xsl:attribute>
</xsl:copy>
</xsl:if>
<xsl:apply-templates select="HierarchyMember"/>
</xsl:template>
</xsl:stylesheet>
--
"Accept that some days you are the pigeon and some days the statue."
"A pat on the back is only a few inches from a kick in the butt." - Dilbert.

Jul 20 '05 #1
5 1626
"Kasp" <ka*************@epatra.com> wrote in message
news:bm**********@newsreader.mailgate.org
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
The XSL declaration with the namespace, this is clear, I quess.
<xsl:output indent="yes"/>
Advises the XSL Processor to indent output tags to make them somewhat
more readable.
<xsl:key name="pageKey" match="//HierarchyMember" use="@PageKey"/>
Creates a key (think of an associative array) named pageKey from all
HierarchyMember elements anywhere in the document, using their PageKey
attribute as association.
<xsl:template match="/">
<Root>
<xsl:apply-templates select="//HierarchyMember"/>
</Root>
</xsl:template>
Matches the root node, puts a Root element around the output and begins
processing all HierarchyMember elements in the documant one by one.

The next template is executed once per HierarchyMember element:
<xsl:template match="HierarchyMember">
<xsl:if test="count(key('pageKey', @PageKey)) > 1"> ------------------------------------------------^
This should be escaped with &gt;

Tests if there is more than one HierarchyMember element with a PageKey
attribute equal to the currently processed HierarchyMember.
The key() function returns all node of the previously created key that
have the value of the current PageKey attribute associated with them.

If this is true, copy the current element into the output: <xsl:copy>
....but add two attributes - one containing the current PageKey:
<xsl:attribute name="PageKey">
<xsl:value-of-select="@PageKey"/>
</xsl:attribute>
....and one containing the count of the HierarchyMember elements havin
the same PageKey as the current one:
<xsl:attribute name="Count">
<xsl:value-of select="count(key 'pageKey',@PageKey))"/>
</xsl:attribute>
</xsl:copy>
</xsl:if>
End if.
<xsl:apply-templates select="HierarchyMember"/>
This is senseless. The template is already repeatedly called by the one
that matches the document root.
</xsl:template>
End of HierarchyMember template.
</xsl:stylesheet>


End of stylesheet.

What the styleheet does is counting how many HierarchyMember elements
with duplicate PageKeys exist in the source .

I don't know if it is a bug, but I guess: The xsl:if will cause
duplicate HierarchyMember elemets to appear in the output, as may as
there are duplicate ones in the input. That means, if there are two
HierarchyMember's having PageKey="1", the outpot will be

<HierarchyMember PageKey="1" Count="2" />
<HierarchyMember PageKey="1" Count="2" />

because there are two elements passing the "count(key('pageKey',
@PageKey)) > 1" test, which are processed one by one, so the condition
is true twice during the transformation process.

Martin

Jul 20 '05 #2
Excellent explanation!

Only two minor things:
The next template is executed once per HierarchyMember element:
<xsl:template match="HierarchyMember">
<xsl:if test="count(key('pageKey', @PageKey)) > 1"> ------------------------------------------------^
This should be escaped with &gt;


Not really. "<" and "&" must be escaped, not ">".
.. . . . . . . . . . . . .
End if.
<xsl:apply-templates select="HierarchyMember"/>


This is senseless. The template is already repeatedly called by the one
that matches the document root.


Yes this is obviously an error, but depending on the source.xml this may or
may not affect the result of the transformation.

For example, if a "HierarchyMember" does not have children which are
"HierarchyMember", then the above xsl:apply-templates will not be applied on
any nodes.
=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL
Jul 20 '05 #3
"Dimitre Novatchev" <dn********@yahoo.com> wrote in message
news:bm************@ID-152440.news.uni-berlin.de
Excellent explanation!


Thanks! :o)
<xsl:if test="count(key('pageKey', @PageKey)) > 1">

-----------------------------------------------^
This should be escaped with &gt;


Not really. "<" and "&" must be escaped, not ">".


I could say "That's why I said `should`." now. ;-)
But actually I was not aware of that (as I always escape tag brackets),
and I did not run the code.
<xsl:apply-templates select="HierarchyMember"/>


This is senseless. The template is already repeatedly called by the
one that matches the document root.


Yes this is obviously an error, but depending on the source.xml this
may or may not affect the result of the transformation.

For example, if a "HierarchyMember" does not have children which are
"HierarchyMember", then the above xsl:apply-templates will not be
applied on any nodes.


I am not sure if I get that. You say it will _not_ be applied if there
are no matching children. That is clear. This implies it would be
applied if there were, that is clear, too.

But I can't see what sense it would make (at least in this context) to
recursively apply the template, as it is already applied to each and
every HierarchyMember by the first (root-matching) one. Would that not
produce even more duplicate output, as any child HierarchyMember is hit
redundantly?

Martin
Jul 20 '05 #4

"Martin Boehm" <ng********@arcor.de> wrote in message
news:3f**********************@newsread4.arcor-online.net...
"Dimitre Novatchev" <dn********@yahoo.com> wrote in message
news:bm************@ID-152440.news.uni-berlin.de
Excellent explanation!
Thanks! :o)
<xsl:if test="count(key('pageKey', @PageKey)) > 1">
-----------------------------------------------^
This should be escaped with &gt;


Not really. "<" and "&" must be escaped, not ">".


I could say "That's why I said `should`." now. ;-)
But actually I was not aware of that (as I always escape tag brackets),
and I did not run the code.
<xsl:apply-templates select="HierarchyMember"/>

This is senseless. The template is already repeatedly called by the
one that matches the document root.


Yes this is obviously an error, but depending on the source.xml this
may or may not affect the result of the transformation.

For example, if a "HierarchyMember" does not have children which are
"HierarchyMember", then the above xsl:apply-templates will not be
applied on any nodes.


I am not sure if I get that. You say it will _not_ be applied if there
are no matching children. That is clear. This implies it would be
applied if there were, that is clear, too.

But I can't see what sense it would make (at least in this context) to
recursively apply the template, as it is already applied to each and
every HierarchyMember by the first (root-matching) one. Would that not
produce even more duplicate output, as any child HierarchyMember is hit
redundantly?


At the scope of the:
<xsl:apply-templates select="HierarchyMember"/>


the current node is an "HierarchyMember" element.

If no "HierarchyMember" element has a "HierarchyMember" child, then the
"select" attribute above will not select any node and, therefore, no
template will be applied.

Therefore, in this case no additional (duplicate) output will be produce.

Of course, the above xsl:apply-templates is an error -- we only talk here
whether the output transformation will be affected by this error.

Unfortunately, for some source xml documents with the structure described
above the output of the transformation will not be affected by the error --
thus the programmer may not notice this meaningless and erroneous xsl
instruction.

=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL


Jul 20 '05 #5
Thanks Martin for your time and explanation - which was very well explained.
Thanks to Dimtre too.

I understand that the <xsl:apply-templates select="HierarchyMember"/>
in <xsl:template match="HierarchyMember"> is redundant.

Thanks.
--
Jul 20 '05 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

21
by: Dave | last post by:
After following Microsofts admonition to reformat my system before doing a final compilation of my app I got many warnings/errors upon compiling an rtf file created in word. I used the Help...
9
by: Tom | last post by:
A question for gui application programmers. . . I 've got some GUI programs, written in Python/wxPython, and I've got a help button and a help menu item. Also, I've got a compiled file made with...
6
by: wukexin | last post by:
Help me, good men. I find mang books that introduce bit "mang header files",they talk too bit,in fact it is my too fool, I don't learn it, I have do a test program, but I have no correct doing...
3
by: Colin J. Williams | last post by:
Python advertises some basic service: C:\Python24>python Python 2.4.1 (#65, Mar 30 2005, 09:13:57) on win32 Type "help", "copyright", "credits" or "license" for more information. >>> With...
7
by: Corepaul | last post by:
Missing Help Files When I enter "recordset" as the keyword and search the Visual Basic Help index, I get many topics of interest in the resulting list. But there isn't any information available...
5
by: Steve | last post by:
I have written a help file (chm) for a DLL and referenced it using Help.ShowHelp My expectation is that a developer using my DLL would be able to access this help file during his development time...
8
by: Mark | last post by:
I have loaded Visual Studio .net on my home computer and my laptop, but my home computer has an abbreviated help screen not 2% of the help on my laptop. All the settings look the same on both...
10
by: JonathanOrlev | last post by:
Hello everybody, I wrote this comment in another message of mine, but decided to post it again as a standalone message. I think that Microsoft's Office 2003 help system is horrible, probably...
1
by: trunxnirvana007 | last post by:
'UPGRADE_WARNING: Array has a new behavior. Click for more: 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="9B7D5ADD-D8FE-4819-A36C-6DEDAF088CC7"' 'UPGRADE_WARNING: Couldn't resolve...
0
by: hitencontractor | last post by:
I am working on .NET Version 2003 making an SDI application that calls MS Excel 2003. I added a menu item called "MyApp Help" in the end of the menu bar to show Help-> About. The application...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.