File: Data.xml
<?xml version="1.0"?>
<parts>
<part id="p10" idref="p20"/>
<part id="p20" idref="p30 p40"/>
<part id="p30"/>
<part id="p40" idref="p10"/>
</parts>
File: Transform.xml
<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:graph="http://wrox.com/569090/graph"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
<xsl:function name="graph:refers" as="xs:boolean">
<xsl:param name="links" as="node()" />
<xsl:param name="A" as="node()" />
<xsl:param name="B" as="node()" />
<xsl:variable name="direct" as="node()*">
<xsl:apply-templates select="$links">
<xsl:with-param name="from" select="$A" />
</xsl:apply-templates>
</xsl:variable>
<xsl:sequence
select="if (exists($direct intersect $B)) then true()
else if (some $C in $direct
satisfies graph:refers($links, $C, $B)) then true()
else false()" />
</xsl:function>
</xsl:transform>
|