[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
[Recent Entries]
[Reply To This Message]
Re: Tricky transformation task
Subject: Re: Tricky transformation task
From: André Locher <jimmy@xxxxxxxxxxxxxx>
Date: Wed, 11 Jul 2007 23:46:44 +0200
|
Sorry about the subject part, I'll keep that in mind. :)
Thanks for the example stylesheet, I've examined it and it's great. I do
have a few remaining problems though:
- My xml's sometimes have more than a few thousand <LINK> tags and after
some magical threshold (a few hundred) the stylesheet throws the
following error:
"Too many nested apply-templates calls. The stylesheet may be looping"
- I forgot to mention that the SUBG-ID which I have to assign has to be
numeric, since it's going to be used as the INDEX key in a database
afterwards. How could I create those without losing too much time?
(position, number, count).
- I have to admit I didn't really get this one part of your stylesheet.
What exactly are you doing here? After the ITEM (L) has been added and
you checked that O1 and O2 are already present, nothing else has to be
added, right?
<xsl:with-param name="r" select="$r/d:join(.,current()/@O1-ID,current()/@O2-ID),$L"/>
Thanks again for the quick and detailed answer. Much appreciated.
Jimmy
David Carlisle schrieb:
(list guidelines would suggest that a different subject line would have
been better, for teh archives)
Your suggested output seems to be missing some lines, eg (if I
understand your input) there is an object 4 as one end of link 18 that
isn't listed in your output.
I added an <end/> stop element just to simplify the end of recursion
testing (as it's time to go home, mainly)
<LINKS>
<LINK ID="2" O1-ID="1" O2-ID="3"/>
<LINK ID="10" O1-ID="1" O2-ID="11"/>
<LINK ID="14" O1-ID="11" O2-ID="15"/>
<LINK ID="18" O1-ID="2" O2-ID="4"/>
<LINK ID="22" O1-ID="2" O2-ID="8"/>
<LINK ID="26" O1-ID="8" O2-ID="17"/>
<end/>
</LINKS>
$ saxon8 links.xml links.xsl
<?xml version="1.0" encoding="UTF-8"?>
<SUBG-ITEMS xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:d="data:,d">
<ITEM SUBG-ID="d1e3" ITEM-ID="1" ITEM-TYPE="O" NAME="Object"/>
<ITEM SUBG-ID="d1e3" ITEM-ID="3" ITEM-TYPE="O" NAME="Object"/>
<ITEM SUBG-ID="d1e3" ITEM-ID="2" ITEM-TYPE="L" NAME="Link"/>
<ITEM SUBG-ID="d1e3" ITEM-ID="11" ITEM-TYPE="O" NAME="Object"/>
<ITEM SUBG-ID="d1e3" ITEM-ID="10" ITEM-TYPE="L" NAME="Link"/>
<ITEM SUBG-ID="d1e3" ITEM-ID="15" ITEM-TYPE="O" NAME="Object"/>
<ITEM SUBG-ID="d1e3" ITEM-ID="14" ITEM-TYPE="L" NAME="Link"/>
<ITEM SUBG-ID="d1e9" ITEM-ID="2" ITEM-TYPE="O" NAME="Object"/>
<ITEM SUBG-ID="d1e9" ITEM-ID="4" ITEM-TYPE="O" NAME="Object"/>
<ITEM SUBG-ID="d1e9" ITEM-ID="18" ITEM-TYPE="L" NAME="Link"/>
<ITEM SUBG-ID="d1e9" ITEM-ID="8" ITEM-TYPE="O" NAME="Object"/>
<ITEM SUBG-ID="d1e9" ITEM-ID="22" ITEM-TYPE="L" NAME="Link"/>
<ITEM SUBG-ID="d1e9" ITEM-ID="17" ITEM-TYPE="O" NAME="Object"/>
<ITEM SUBG-ID="d1e9" ITEM-ID="26" ITEM-TYPE="L" NAME="Link"/>
</SUBG-ITEMS>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:d="data:,d"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes"/>
<xsl:template match="LINKS">
<xsl:apply-templates select="LINK[1]"/>
</xsl:template>
<xsl:template match="LINK">
<xsl:param name="r" select="()"/>
<xsl:variable name="ro" select="$r[@ITEM-TYPE='O']"/>
<xsl:choose>
<xsl:when test="@O1-ID=$ro/@ITEM-ID">
<xsl:variable name="L" as="element()">
<ITEM SUBG-ID="{$ro[@ITEM-ID=current()/@O1-ID]/@SUBG-ID}" ITEM-ID="{@ID}" ITEM-TYPE="L" NAME="Link"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="@O2-ID=$ro/@ITEM-ID">
<xsl:apply-templates select="following-sibling::*[1]">
<xsl:with-param name="r" select="$r/d:join(.,current()/@O1-ID,current()/@O2-ID),$L"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="O" as="element()">
<ITEM SUBG-ID="{$ro[@ITEM-ID=current()/@O1-ID]/@SUBG-ID}" ITEM-ID="{@O2-ID}" ITEM-TYPE="O" NAME="Object"/>
</xsl:variable>
<xsl:apply-templates select="following-sibling::*[1]">
<xsl:with-param name="r" select="$r,$O,$L"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="@O2-ID=$ro/@ITEM-ID">
<xsl:variable name="L" as="element()">
<ITEM SUBG-ID="{$ro[@ITEM-ID=current()/@O2-ID]/@SUBG-ID}" ITEM-ID="{@ID}" ITEM-TYPE="L" NAME="Link"/>
</xsl:variable>
<xsl:variable name="O" as="element()">
<ITEM SUBG-ID="{$ro[@ITEM-ID=current()/@O2-ID]/@SUBG-ID}" ITEM-ID="{@O2-ID}" ITEM-TYPE="O" NAME="Object"/>
</xsl:variable>
<xsl:apply-templates select="following-sibling::*[1]">
<xsl:with-param name="r" select="$r,$O,$L"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="L" as="element()">
<ITEM SUBG-ID="{generate-id()}" ITEM-ID="{@ID}" ITEM-TYPE="L" NAME="Link"/>
</xsl:variable>
<xsl:variable name="O1" as="element()">
<ITEM SUBG-ID="{generate-id()}" ITEM-ID="{@O1-ID}" ITEM-TYPE="O" NAME="Object"/>
</xsl:variable>
<xsl:variable name="O2" as="element()">
<ITEM SUBG-ID="{generate-id()}" ITEM-ID="{@O2-ID}" ITEM-TYPE="O" NAME="Object"/>
</xsl:variable>
<xsl:apply-templates select="following-sibling::*[1]">
<xsl:with-param name="r" select="$r,$O1,$O2,$L"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="end">
<xsl:param name="r" select="()"/>
<SUBG-ITEMS>
<xsl:perform-sort select="$r">
<xsl:sort select="@SUBG-ID"/>
</xsl:perform-sort>
</SUBG-ITEMS>
</xsl:template>
<xsl:function name="d:join">
<xsl:param name="e"/>
<xsl:param name="i1"/>
<xsl:param name="i2"/>
<ITEM>
<xsl:copy-of select="$e/@*"/>
<xsl:if test="$e/@SUBG-ID=$i2">
<xsl:attribute name="SUBG-ID" select="$i1"/>
</xsl:if>
</ITEM>
</xsl:function>
</xsl:stylesheet>
________________________________________________________________________
The Numerical Algorithms Group Ltd is a company registered in England
and Wales with company number 1249803. The registered office is:
Wilkinson House, Jordan Hill Road, Oxford OX2 8DR, United Kingdom.
This e-mail has been scanned for all viruses by Star. The service is
powered by MessageLabs.
________________________________________________________________________
|
PURCHASE STYLUS STUDIO ONLINE TODAY!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Download The World's Best XML IDE!
Accelerate XML development with our award-winning XML IDE - Download a free trial today!
Subscribe in XML format
RSS 2.0 |
|
Atom 0.3 |
|
|