I have a repetable custon control 2.0 for which I am trying to modifed to pick up the current page or ancestors page to get the data, It mostly works. It works for the first page that has data and it works for any child who don't have data, but when I have a second child that has data, it picks up the data from higher up in the list. I tried playing with node and root instand of * for ancestor-or-self but they don't work. I guess I still don't understand fully how ancestor-or-self works.
<!-- Live Editing support for related links. --> <xsl:value-of select="umbraco.library:Item($currentPage/@id,$propertyAlias,'')" /> </div> </xsl:template>
To get the closest ancestor with a value in the buttonNav property, you add a so-called predicate to specify that the nodes in the set should have a non-empty "buttonNav" property; and then you take the first from that set - like this:
Then you can do stuff with that - but it's important that you include the [1] filter right away (and not inside the <for-each> as you did) because the nodes will be in "document order" when you access them from the variable...
So since the variable now points to the ancestor(or self) you can iterate or appy, whichever suits you, e.g.:
<xsl:for-each select="$navFromAncestor/buttonNav/items/item">
<!-- do stuff -->
</xsl:for-each>
Repeteable Custom Contorl XSLT for ancestors
I have a repetable custon control 2.0 for which I am trying to modifed to pick up the current page or ancestors page to get the data, It mostly works. It works for the first page that has data and it works for any child who don't have data, but when I have a second child that has data, it picks up the data from higher up in the list. I tried playing with node and root instand of * for ancestor-or-self but they don't work. I guess I still don't understand fully how ancestor-or-self works.
the data
<buttonNav>
<items>
<item>
<data alias="button">1116</data>
<data alias="url">/solutions/sol-ppo-network.aspx</data>
</item>
<item>
<data alias="button">1115</data>
<data alias="url">/solutions/sol-medical-bill-review.aspx</data>
</item>
<item>
<data alias="button">1117</data>
<data alias="url">/solutions/sol-case-management.aspx -</data>
</item>
<item>
<data alias="button">1123</data>
<data alias="url">/solutions/sol-nj-auto-precert.aspx</data>
</item>
<item>
<data alias="button">1124</data>
<data alias="url">/solutions/sol-aims.aspx</data>
</item>
</items>
</buttonNav>
the xslt
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets"
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets ">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<!-- Input the repeatable custom contents property alias here -->
<xsl:variable name="propertyAlias" select="string('buttonNav')"/>
<xsl:template match="/">
<!-- start writing XSLT -->
<div id="buttons">
<xsl:for-each select="$currentPage/ancestor-or-self::* /buttonNav[1]/items/item">
<xsl:if test="position() = 1">
<h3>Learn More:</h3>
</xsl:if>
<p>
<xsl:element name="a">
<xsl:attribute name="href">
<xsl:value-of select="./data [@alias = 'url']" disable-output-escaping="yes"/>
</xsl:attribute>
<xsl:element name="img">
<xsl:attribute name="src">
<xsl:value-of select="umbraco.library:GetMedia(./data [@alias = 'button'], 0)/umbracoFile" />
</xsl:attribute>
</xsl:element>
</xsl:element>
</p>
</xsl:for-each>
<!-- Live Editing support for related links. -->
<xsl:value-of select="umbraco.library:Item($currentPage/@id,$propertyAlias,'')" />
</div>
</xsl:template>
</xsl:stylesheet>
As a update, fooling around I changed the select line to:
<xsl:for-each select="$currentPage/ancestor-or-self::* /buttonNav/items/item">
and now not only does it get the closest node, but all the nodes.
What I want is the closest not empty node
Not tested, but maybe try this:
$currentPage/ancestor-or-self::* [@isDoc][count(./buttonNav/items/item) > 0]
-Tom
Thanks for the try, nothing shows up on pages where buttonNav doesn't have any entires but all I get is
Error parsing XSLT file: \xslt\buttonNav.xslt
for pages that have buttonNav entires.
Hi Bruce,
Take a look at this visualization of the ancestor-or-self:: axis - you get a set of nodes back, as you can see.
To get the closest ancestor with a value in the buttonNav property, you add a so-called predicate to specify that the nodes in the set should have a non-empty "buttonNav" property; and then you take the first from that set - like this:
Then you can do stuff with that - but it's important that you include the [1] filter right away (and not inside the <for-each> as you did) because the nodes will be in "document order" when you access them from the variable...
So since the variable now points to the ancestor(or self) you can iterate or appy, whichever suits you, e.g.:
/Chriztian
Chriztian,
That code change makes it work as I want it to.
Thank you very much for your explanation of ancestor-or-self. The visualization link was very helpful.
Bruce
is working on a reply...