xsl-list
[Top] [All Lists]

Re: [xsl] XPath 2.0 expression that detects a cycle of references?

2016-03-29 03:57:27
On 29.03.2016 10:46, Michael Müller-Hillebrand mmh(_at_)docufy(_dot_)de wrote:
I think you need to write a recursive function to detect cycles in a graph, and 
XPath 2.0 does not have sufficient power for this. It can of course be done in 
XSLT or XQuery. It can possibly be done in  XPath 3.0, though because XPath 3.0 
functions are anonymous, recursion is tricky.

Well, how would that kind of trick look like?

This is my version of a recursive function for Roger's problem (assuming there can be 
multiple elements <for-more-info>):

<xsl:function name="my:CycleFound" as="xs:boolean">
   <xsl:param name="this" as="element()?"/>
   <xsl:param name="visited" as="xs:string*"/>
   <xsl:variable name="refId" select="$this/for-more-info/@idref" 
as="xs:string*"/>
   <xsl:variable name="refTgt" select="$this/../item[@id = $refId]" 
as="element()*"/>

   <xsl:sequence select="
     if (not(exists($refTgt))) then false()
     else if ($refId = $visited) then true()
     else some $e in $refTgt satisfies my:CycleFound($e, ($visited, $e/@id))
     "/>
</xsl:function>

I have no idea how one would have to handle this using XPath 3… any suggestions?

Dimitre has an article on using two anonymous function together with "let", to implement the recursion:

https://dnovatchev.wordpress.com/2012/10/15/recursion-with-anonymous-inline-functions-in-xpath-3-0-2/


---
Diese E-Mail wurde von Avast Antivirus-Software auf Viren geprüft.
https://www.avast.com/antivirus
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>