Re: [xsl] enumerating combination

Subject: Re: [xsl] enumerating combination
From: Matthieu Ricaud <matthieu.ricaud@xxxxxxxxx>
Date: Thu, 28 Jun 2007 11:23:09 +0200
Hi Florent,

Thanks a lot for your solution !

Yes sorry for the mistakes in the xml sample I gave, it was late ...
(and sorry too for having reply to an another thread with another new subject)

I also forgot to precise that I wanted to do this in XSLT 1.0 but I adpat your 
solution to 1.0 and it goes well :-)

This is my final xsl, I generate some xml finaly (I'll put it in a variable to 
iterate on it and make what I need) : 

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
version="1.0">
	
	<xsl:output method="xml"/>
	
	<xsl:template match="spellchecker">
		<all-combinations>
			<xsl:apply-templates select="word[1]"/>
		</all-combinations>
	</xsl:template>
	
	<xsl:template match="word">
		<xsl:param name="line" select="''"/>
		<xsl:apply-templates select="suggest">
			<xsl:with-param name="line" select="$line"/>
		</xsl:apply-templates>
	</xsl:template>
	
	<xsl:template match="suggest | word[not(*)]">
		<xsl:param name="line" select="/"/>
		<xsl:variable name="next-word" 
select="self::suggest/parent::word/following-sibling::word[1] | 
self::word/following-sibling::word[1]"/>
		<xsl:variable name="new-line">
			<xsl:copy-of select="$line"/>
			<word>
				<xsl:attribute name="suggest">
					<xsl:choose>
						<xsl:when test="name() = 'word'">false</xsl:when>
						<xsl:otherwise>true</xsl:otherwise>
					</xsl:choose>
				</xsl:attribute>
				<xsl:value-of select="@value"/>
			</word>
		</xsl:variable>
		<xsl:choose>
			<xsl:when test="not($next-word)"> <!--last word : next-word empty, it 
doesn't exist -->
				<combination>
					<xsl:copy-of select="$new-line"/>
				</combination>
				<xsl:text>&#10;</xsl:text>
			</xsl:when>
			<xsl:otherwise> <!--not last word, then continue-->
				<xsl:apply-templates select="$next-word">
					<xsl:with-param name="line" select="$new-line"/>
				</xsl:apply-templates>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

</xsl:stylesheet>

which gave as result (apply on the same xml) :

<?xml version="1.0" encoding="utf-8"?>
<all-combinations>
	<combination>
		<word suggest="true">a1</word>
		<word suggest="false">b</word>
		<word suggest="true">c1</word>
		<word suggest="true">d1</word>
	</combination>
	<combination>
		<word suggest="true">a1</word>
		<word suggest="false">b</word>
		<word suggest="true">c1</word>
		<word suggest="true">d2</word>
	</combination>
	<combination>
		<word suggest="true">a1</word>
		<word suggest="false">b</word>
		<word suggest="true">c1</word>
		<word suggest="true">d3</word>
	</combination>
	<combination>
		<word suggest="true">a1</word>
		<word suggest="false">b</word>
		<word suggest="true">c2</word>
		<word suggest="true">d1</word>
	</combination>
	<combination>
		<word suggest="true">a1</word>
		<word suggest="false">b</word>
		<word suggest="true">c2</word>
		<word suggest="true">d2</word>
	</combination>
	<combination>
		<word suggest="true">a1</word>
		<word suggest="false">b</word>
		<word suggest="true">c2</word>
		<word suggest="true">d3</word>
	</combination>
	<combination>
		<word suggest="true">a1</word>
		<word suggest="false">b</word>
		<word suggest="true">c3</word>
		<word suggest="true">d1</word>
	</combination>
	<combination>
		<word suggest="true">a1</word>
		<word suggest="false">b</word>
		<word suggest="true">c3</word>
		<word suggest="true">d2</word>
	</combination>
	<combination>
		<word suggest="true">a1</word>
		<word suggest="false">b</word>
		<word suggest="true">c3</word>
		<word suggest="true">d3</word>
	</combination>
	<combination>
		<word suggest="true">a2</word>
		<word suggest="false">b</word>
		<word suggest="true">c1</word>
		<word suggest="true">d1</word>
	</combination>
	<combination>
		<word suggest="true">a2</word>
		<word suggest="false">b</word>
		<word suggest="true">c1</word>
		<word suggest="true">d2</word>
	</combination>
	<combination>
		<word suggest="true">a2</word>
		<word suggest="false">b</word>
		<word suggest="true">c1</word>
		<word suggest="true">d3</word>
	</combination>
	<combination>
		<word suggest="true">a2</word>
		<word suggest="false">b</word>
		<word suggest="true">c2</word>
		<word suggest="true">d1</word>
	</combination>
	<combination>
		<word suggest="true">a2</word>
		<word suggest="false">b</word>
		<word suggest="true">c2</word>
		<word suggest="true">d2</word>
	</combination>
	<combination>
		<word suggest="true">a2</word>
		<word suggest="false">b</word>
		<word suggest="true">c2</word>
		<word suggest="true">d3</word>
	</combination>
	<combination>
		<word suggest="true">a2</word>
		<word suggest="false">b</word>
		<word suggest="true">c3</word>
		<word suggest="true">d1</word>
	</combination>
	<combination>
		<word suggest="true">a2</word>
		<word suggest="false">b</word>
		<word suggest="true">c3</word>
		<word suggest="true">d2</word>
	</combination>
	<combination>
		<word suggest="true">a2</word>
		<word suggest="false">b</word>
		<word suggest="true">c3</word>
		<word suggest="true">d3</word>
	</combination>
</all-combinations>

Thanks again,

Regards, 

Matthieu.


> Matthieu Ricaud wrote:
>
>   Hi
>
> > It's about a spellchecker. When searching for an experssion
> > with say N words, I want to list every combinations of
> > suggested words.
>
>   I guess you made an error in your input file (besides the typo
> s/valeur/value/), and there should be only 2 As and only 3 Ds.
>
>   So you want to walk from words to words starting at the first word,
> in the document order.  For each, either you use its @value or apply
> each of its suggest, in the document order.  For suggest, you want to
> use its @value and then apply the next word.  Doing so, you construct
> the string from step to step.  Where there is no more 'next word', you
> output the string and you backtrack:
>
> (drkm)[4] ~/xslt/tests$ cat spell-check.xml
> <spellchecker date="Wed Jun 27 17:13:12 CEST 2007">
>
>   <word value="a" exist="false">
>     <suggest value="a1"/>
>     <suggest value="a2"/>
>   </word>
>
>   <word value="b" exist="true"></word>
>
>   <word value="c" exist="false">
>     <suggest value="c1"/>
>     <suggest value="c2"/>
>     <suggest value="c3"/>
>   </word>
>
>   <word value="d" exist="false">
>     <suggest value="d1"/>
>     <suggest value="d2"/>
>     <suggest value="d3"/>
>   </word>
>
> </spellchecker>
>
> (drkm)[5] ~/xslt/tests$ cat spell-check.xsl
> <xsl:stylesheet
>     xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>     version="2.0">
>
>   <xsl:output method="text"/>
>
>   <xsl:template match="spellchecker">
>     <xsl:apply-templates select="word[1]"/>
>   </xsl:template>
>
>   <xsl:template match="word">
>     <xsl:param name="line" select="''"/>
>     <xsl:apply-templates select="suggest">
>       <xsl:with-param name="line" select="$line"/>
>     </xsl:apply-templates>
>   </xsl:template>
>
>   <xsl:template match="suggest | word[empty(*)]">
>     <xsl:param name="line" select="''"/>
>     <xsl:variable name="next-word" select="
>         ../following-sibling::word[1]
>
>         | following-sibling::word[1]"/>
>
>     <xsl:variable name="new-line" select="
>         concat($line, ' ', @value)"/>
>     <xsl:choose>
>       <xsl:when test="empty($next-word)">
>         <xsl:value-of select="$new-line"/>
>         <xsl:text>&#10;</xsl:text>
>       </xsl:when>
>       <xsl:otherwise>
>         <xsl:apply-templates select="$next-word">
>           <xsl:with-param name="line" select="$new-line"/>
>         </xsl:apply-templates>
>       </xsl:otherwise>
>     </xsl:choose>
>   </xsl:template>
>
> </xsl:stylesheet>
>
> (drkm)[6] ~/xslt/tests$ saxon spell-check.xml spell-check.xsl
>  a1 b c1 d1
>  a1 b c1 d2
>  a1 b c1 d3
>  a1 b c2 d1
>  a1 b c2 d2
>  a1 b c2 d3
>  a1 b c3 d1
>  a1 b c3 d2
>  a1 b c3 d3
>  a2 b c1 d1
>  a2 b c1 d2
>  a2 b c1 d3
>  a2 b c2 d1
>  a2 b c2 d2
>  a2 b c2 d3
>  a2 b c3 d1
>  a2 b c3 d2
>  a2 b c3 d3
>
> (drkm)[7] ~/xslt/tests$
>
>   I think that would help you, if I understood corectly your problem.
>
>   Regards,
>
> --drkm
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>      
> ___________________________________________________________________________
>__ Ne gardez plus qu'une seule adresse mail ! Copiez vos mails vers Yahoo!
> Mail

Current Thread