[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: tokenize() and regex-group ?
Hi
Just a last word to say my problem is solved, thanks for your reactive and helpfull help ! Just a few comments here : I used a self igs:tokenize-as-xml function that doesn't loose the "regex separator" (see last mail). I just change the output of the function to be a single element with children : <xsl:function name="igs:tokenize-as-xml" as="element(igs:tok)"> instead of a sequence of elements : <xsl:function name="igs:tokenize-as-xml" as="element()*"> Why ? because it's seems one can not use "axes" (preceding-sibling::, << operator ...) "very well" within a sequence, one need a context. I actually get some strange results when using : <xsl:variable name="textBegin" select="string-join($tokenTextAsXML[ . << $myFocusElement],'')"/> (looks like a filter is added, selecting only node whose name is the same as $myFocusElement) by the way myFocusElement is defined within the reccursion by : <xsl:variable name="myFocusElement" select="$tokenTextAsXML[last() - $lookBacklevel + 1]" as="element()"/> when I used <xsl:function name="igs:tokenize-as-xml" as="element(igs:tok)"> and <xsl:variable name="textBegin" select="string-join($tokenTextAsXML/igs:*[ . << $myFocusElement],'')"/> everything is going fine. Well, I tried to simplifie the explanation, hope this is understandable. Let see the real code at the bottom of this mail. Best Regards, Matthieu Ricaud. <xsl:function name="igs:tokenize-as-xml" as="element(igs:tok)"> <xsl:param name="string" as="xs:string"/> <xsl:param name="regex" as="xs:string"/> <xsl:variable name="tmp" as="element()*"> <xsl:analyze-string select="$string" regex="{$regex}"> <xsl:matching-substring> <igs:sep><xsl:value-of select="."/></igs:sep> </xsl:matching-substring> <xsl:non-matching-substring> <igs:text><xsl:value-of select="."/></igs:text> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:variable> <igs:tok> <xsl:for-each-group select="$tmp" group-adjacent="local-name(.)='sep'"> <xsl:choose> <xsl:when test="current-grouping-key()"> <igs:sep><xsl:value-of select="string-join(current-group(),'')"/></igs:sep> </xsl:when> <xsl:otherwise> <xsl:copy-of select="current-group()"/> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </igs:tok> </xsl:function> (myFocusElement is called splitter in the real code) <xsl:template name="addRefTheme"> <xsl:param name="text" as="xs:string"/> <xsl:param name="lookBacklevel" select="1" as="xs:integer"/> <xsl:variable name="tokenTextAsXML" select="igs:tokenize-as-xml($text,'(\s|\(|B+\p{Z}|\p{Z}B;|[lL]b)')" as="element()*"/> <!-- the text is splitted in 2 parts, one will then try to get a corresponding anchor from the 2nd one--> <xsl:variable name="tokenNum" select="count($tokenTextAsXML/igs:*)" as="xs:integer"/> <xsl:variable name="spliter" select="$tokenTextAsXML/igs:*[last() - $lookBacklevel + 1]" as="element()"/> <xsl:variable name="textBegin" select="string-join($tokenTextAsXML/igs:*[ . << $spliter],'')"/> <xsl:variable name="textEnd" select="string-join($tokenTextAsXML/igs:*[. >> $spliter or . is $spliter],'')"/> <xsl:variable name="matchingAncres" select="$ancres[normalize-space($textEnd)!=''][igs:match-ancre(.,$textEnd)]" as="element()*"/> <xsl:variable name="error.msg"> [ERROR][STEP7][ref:theme] <xsl:value-of select="count($matchingAncres)"/> ancre(s) trouvee(s) pour [text=<xsl:value-of select="concat($text,$asterix)"/>]<xsl:call-template name="lf"/> <xsl:if test="$config/@debug='1'"> [lookBacklevel=<xsl:value-of select="$lookBacklevel"/>]<xsl:call-template name="lf"/> [textBegin=<xsl:value-of select="$textBegin"/>]<xsl:call-template name="lf"/> [textEnd=<xsl:value-of select="$textEnd"/>]<xsl:call-template name="lf"/> </xsl:if> </xsl:variable> <xsl:variable name="ref_theme_override" select="$config/igs:ref_theme_override/igs:string[normalize-space(@value)=concat(normalize-space($textEnd),$asterix)]" as="element()?"/> <xsl:choose> <xsl:when test="count($ref_theme_override)=1"> <xsl:copy-of select="$ref_theme_override/node()" copy-namespaces="no"/> </xsl:when> <xsl:when test="count($matchingAncres)=1"> <xsl:value-of select="$textBegin"/> <ref:theme idrefCorps="{$matchingAncres/@id}"><xsl:value-of select="concat($textEnd,$asterix)"/></ref:theme> </xsl:when> <xsl:when test="count($matchingAncres) gt 1"> <xsl:message><xsl:value-of select="$error.msg"/></xsl:message> <xsl:value-of select="concat($text,$asterix)"/> </xsl:when> <xsl:when test="$lookBacklevel lt $tokenNum"> <xsl:call-template name="addRefTheme"> <xsl:with-param name="text" select="$text"/> <xsl:with-param name="lookBacklevel" select="$lookBacklevel + 1"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:message><xsl:value-of select="$error.msg"/></xsl:message> <xsl:value-of select="concat($text,$asterix)"/> </xsl:otherwise> </xsl:choose> </xsl:template> Le 17/07/2012 16:54, Matthieu Ricaud-Dussarget a C)crit : Thank you Michael. -- Matthieu Ricaud 05 45 37 08 90 IGS-CP, service livres numC)riques
|
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
|