[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
Re:  Tricky transformation task
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. ________________________________________________________________________

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.