By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
459,636 Members | 1,693 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 459,636 IT Pros & Developers. It's quick & easy.

XSLT Sorting this XML...

P: n/a
I have this XML file which I would like to XSLT-sort based on the
string contained within the item-children elements using basic MSXML
(no recent version of IIS, so it might be an outdated MSXML -- pretty
sure not MSXML4, though tips on how to do it with that are appreciated
too):

----------- Translation Dictionary (German) ----
<?xml version="1.0" encoding="iso-8859-1"?>
<items>
<item id="4">
<Deutsch>Registrieren</Deutsch>
<Englisch-GB>Register</Englisch-GB>
<Englisch-US>Register</Englisch-US>
<Französisch>S'enregistrer</Französisch>
<Italienisch>Registra</Italienisch>
<Spanisch>Darse de alta</Spanisch>
<Portugiesisch></Portugiesisch>
<Niederländisch>Registreren</Niederländisch>
<Kommentar></Kommentar>
</item>
<item id="5">
<Deutsch>Login</Deutsch>
<Englisch-GB>Login</Englisch-GB>
<Englisch-US>Login</Englisch-US>
<Französisch>Login</Französisch>
<Italienisch>Login</Italienisch>
<Spanisch>Inicio de sesión</Spanisch>
<Portugiesisch></Portugiesisch>
<Niederländisch>Login</Niederländisch>
<Kommentar></Kommentar>
</item>
<!-- ... and many more item-elements -->
</items>
------------------------------------------------

Thanks for any tips!
(P.S.: Am always disappointed by lack of XPath sorting features. It's a
hassle compared to e.g. SQL. Last time I had to implement an object
with an object sorter to sort some integers in XML. I also tried
XSLT-sorting from examples found online but often ran into troubles, I
believe it also has to do with limited capabilities of basic-MSXML as
installed with older versions of IIS.)
Jul 20 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a


Philipp Lenssen wrote:
I have this XML file which I would like to XSLT-sort based on the
string contained within the item-children elements using basic MSXML
(no recent version of IIS, so it might be an outdated MSXML -- pretty
sure not MSXML4, though tips on how to do it with that are appreciated
too):

----------- Translation Dictionary (German) ----
<?xml version="1.0" encoding="iso-8859-1"?>
<items>
<item id="4">
<Deutsch>Registrieren</Deutsch>
<Englisch-GB>Register</Englisch-GB>
<Englisch-US>Register</Englisch-US>
<Französisch>S'enregistrer</Französisch>
<Italienisch>Registra</Italienisch>
<Spanisch>Darse de alta</Spanisch>
<Portugiesisch></Portugiesisch>
<Niederländisch>Registreren</Niederländisch>
<Kommentar></Kommentar>
</item>
<item id="5">
<Deutsch>Login</Deutsch>
<Englisch-GB>Login</Englisch-GB>
<Englisch-US>Login</Englisch-US>
<Französisch>Login</Französisch>
<Italienisch>Login</Italienisch>
<Spanisch>Inicio de sesión</Spanisch>
<Portugiesisch></Portugiesisch>
<Niederländisch>Login</Niederländisch>
<Kommentar></Kommentar>
</item>
<!-- ... and many more item-elements -->
</items>

Assuming you want to copy all nodes while ordering the children of
<item> by their content the following is an XSLT 1.0 stylesheet that
does that:

<?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" indent="yes" encoding="ISO-8859-1" />

<xsl:template match="item">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="*">
<xsl:sort data-type="text" order="ascending" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

The result of the example file transformed with Xalan is

<?xml version="1.0" encoding="ISO-8859-1"?>
<items>
<item id="4">
<Portugiesisch/>
<Kommentar/>
<Spanisch>Darse de alta</Spanisch>
<Englisch-GB>Register</Englisch-GB>
<Englisch-US>Register</Englisch-US>
<Italienisch>Registra</Italienisch>
<Niederländisch>Registreren</Niederländisch>
<Deutsch>Registrieren</Deutsch>
<Französisch>S'enregistrer</Französisch>
</item>
<item id="5">
<Portugiesisch/>
<Kommentar/>
<Spanisch>Inicio de sesión</Spanisch>
<Deutsch>Login</Deutsch>
<Englisch-GB>Login</Englisch-GB>
<Englisch-US>Login</Englisch-US>
<Französisch>Login</Französisch>
<Italienisch>Login</Italienisch>
<Niederländisch>Login</Niederländisch>
</item>
<!-- ... and many more item-elements -->
</items>
As for MSXML, as far as I know MSXML 3.0 is the first to support XSLT
1.0 (which is indentified by the namespace URI
http://www.w3.org/1999/XSL/Transform). Earlier versions only support
some working draft (WD) with a different namespace and different
elements and semantics. I stronly suggest to get your ISP to install at
least MSXML 3.0 if you want to do XSLT 1.0 transformations.
--

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

Jul 20 '05 #2

P: n/a
Martin Honnen wrote:
Philipp Lenssen wrote:

<?xml version="1.0" encoding="iso-8859-1"?>
<items>
<item id="4">
<Deutsch>Registrieren</Deutsch>
<Englisch-GB>Register</Englisch-GB>
<Englisch-US>Register</Englisch-US>
<Französisch>S'enregistrer</Französisch>
<Italienisch>Registra</Italienisch>
<Spanisch>Darse de alta</Spanisch>
<Portugiesisch></Portugiesisch>
<Niederländisch>Registreren</Niederländisch>
<Kommentar></Kommentar>
</item>
<item id="5">
<Deutsch>Login</Deutsch>
<Englisch-GB>Login</Englisch-GB>
<Englisch-US>Login</Englisch-US>
<Französisch>Login</Französisch>
<Italienisch>Login</Italienisch>
<Spanisch>Inicio de sesión</Spanisch>
<Portugiesisch></Portugiesisch>
<Niederländisch>Login</Niederländisch>
<Kommentar></Kommentar>
</item>
<!-- ... and many more item-elements -->
</items>

Assuming you want to copy all nodes while ordering the children of
<item> by their content the following is an XSLT 1.0 stylesheet that
does that:


I'm sorry, I should have made this clear: I want to sort by a certain
language (the children of "item"-element are language-names in German).
For example, I pass the parameter "Deutsch", and then it should sort
alphabetically by the "Deutsch"-element's text-content. Same for e.g.
"Italienisch". I will keep your current solution for another day.
Thanks for your help so far!
Jul 20 '05 #3

P: n/a
"Philipp Lenssen" <in**@outer-court.com> writes:
Martin Honnen wrote:
Philipp Lenssen wrote:
<?xml version="1.0" encoding="iso-8859-1"?>
<items>
<item id="4">
<Deutsch>Registrieren</Deutsch>
<Englisch-GB>Register</Englisch-GB>
<Englisch-US>Register</Englisch-US>
<Französisch>S'enregistrer</Französisch>
<Italienisch>Registra</Italienisch>
<Spanisch>Darse de alta</Spanisch>
<Portugiesisch></Portugiesisch>
<Niederländisch>Registreren</Niederländisch>
<Kommentar></Kommentar>
</item>
<item id="5">
<Deutsch>Login</Deutsch>
<Englisch-GB>Login</Englisch-GB>
<Englisch-US>Login</Englisch-US>
<Französisch>Login</Französisch>
<Italienisch>Login</Italienisch>
<Spanisch>Inicio de sesión</Spanisch>
<Portugiesisch></Portugiesisch>
<Niederländisch>Login</Niederländisch>
<Kommentar></Kommentar>
</item>
<!-- ... and many more item-elements -->
</items>


[snip]
I'm sorry, I should have made this clear: I want to sort by a certain
language (the children of "item"-element are language-names in German).
For example, I pass the parameter "Deutsch", and then it should sort
alphabetically by the "Deutsch"-element's text-content. Same for e.g.
"Italienisch". I will keep your current solution for another day.
Thanks for your help so far!


I'm not familiar with MSXML (I'm using Xalan), but something like this
should work...

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="ISO-8859-1"/>

<xsl:template match="items">
<xsl:apply-templates select="item">
<xsl:sort select="item/Deutsch"/>
</xsl:apply-templates>
</xsl:template>

<!-- insert all other templates to process the items -->

</xsl:stylesheet>

Best wishes,
Mats Kindahl
--
IAR Systems in Uppsala, Sweden.

Any opinions expressed are my own and not those of my company.

Spam prevention: contact me at mN**********@acm.org or
mN****************@iar.se, removing the *NO SPAM* from the address.
Jul 20 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.