Yes you need an for loop with a folder. This is because the folder has the images as children. So we need to loop through his children if u want to acces them.
What is posible th,o is selecting an image from its index like this:
so $currentPage/yourImage is the media picker property pointing at company logo. this workd with xslt just specified in line above.
There is also an image gallery page wher i use the for loop you gave me above. This too now works after adding /Folder/Image.
so all now works A ok,
my query was that when i get the logo as in xslt line above i dont specif /Folder/Image/umbracoFile. I just need to specify/Image/umbracoFile.
where as in the for loop when i traverse thru a folder in the media sections to get all images in that folder i need to specify/Folder/Image
So what i understand is that in a for loop when getting images from a folder we use /Folder/Image, but when we are getting just one image there is no need to specify /Folder/Image/umbracoFile, we can just specify/Image/umbracoFile.
So i'm trying to get a better understanding of the syntax.
Ah ok :) thanks for clearing out. And yes you are correct!
This is because when umbraco.library:GetMedia gives us a folder back, we acces it by /Folder. If it gives us an image back, we acces it by /Image.
And we use a for-each loop if we want to loop through the children of an node. like when we loop trough the children nodes of the folder in /Folder/Image
I dont know if this variable imageRoot is works. <xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self::* [@level = 1]/* [@isDoc and string(frontPageImages) !='-1']"/>
//generate random number function generateRandom(){ index= Math.floor(Math.random() * myArray.length); // change myArray.length to (myArray.length-1) }
so you would get //generate random number function generateRandom(){ index= Math.floor(Math.random() * (myArray.length-1)); }
necessary since in your code Math.Random generates between 0-1. you multiply it with 2 wich means you get 0,1,2 = 3 images, changing it to multiply with 1 less gets you 0,1 = 2 images
::edit::
Sorry i was wrong, this is needed when u use xstl indexes. (xslt begins on 1, javascript on 0)
Hey Neils thanx for all yr help in this...its getting late on friday but you still helping...U r kool.
i've posted my original ver4 xslt below which exact same job but no hello world image:
I'm wondering if its anything to do with the imageRoot selction. I mean could it be trying to convert the frontPageImages folder into a image and hence the helloworld image.
if you us xsl:copy-of on the umbraco.library:GetMedia($imageRoot, true()) U can see that the /Folder has more children than just Image or File. it also has an empty <contents></contents> child.
Wich explains the third child.
So i think that this would work: <xsl:call-template name="buildArray"> <xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, true())/Folder/Image"/> </xsl:call-template>
An more ugly fix would be: <xsl:for-each select="$arrayNodes"> <xsl:if test="@nodeTypeAlias = 'Image' "'> <xsl:value-of select="myFuncs:addtoArray(string(umbracoFile),string(caption))"/> </xsl:if> </xsl:for-each>
As for the selector <xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self:: node[@level = 1]/data [@alias = 'frontPageImages']"/>
i would make that <xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self:: * [@isDoc][@level = 1]/frontPageImages"/>
Microsoft.JScript.JScriptException: Object required
at Microsoft.JScript.Convert.ToObject(Object value, VsaEngine engine)
at System.Xml.Xsl.CompiledQuery.Script129.getUrl()
how do i use:"@nodeTypeAlias = 'Image' at time of selection like with this:
U can try this for the nodes selector <xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, true())/Folder/* [@nodeTypeAlias = 'Image']"/>
Hey Neils, even with Nodes selector you kindly posted above get error:
Microsoft.JScript.JScriptException: Object required
at Microsoft.JScript.Convert.ToObject(Object value, VsaEngine engine)
at System.Xml.Xsl.CompiledQuery.Script149.getUrl()
looks like all the possibilities to prevent the content node from being passed thru to addToArray are being blocked by this error.
Ok I went to umbraco and tested your code, runs with no errors here :O (with /Folder/Image) Ofcourse i diddnt use your imageRoot variable, i just used a NodeId
//generate random number function generateRandom(){ index= Math.floor(Math.random() * myArray.length); //array lenth is 3 as we 2 images and an empty content folder. if (index == 0){ index = 1; }
}
function addtoArray(itemUrl, itemCaption){ var item = {url: itemUrl, caption: itemCaption}; myArray.push(item); } //get image url from array function getUrl(){ return myArray[index].url; }
//get caption from array function getCaption(){ return myArray[index].caption; }
Hi all, is there a way of getting media images from a media folder to display where the media folder = the media folder selected by a media picker on a content node?
version 4.5 xslt for getting all images from a folder in media
Hi everyone,
I'm converting an xslt 4 to 4.5 file which is used to get all images from a sub folder in the media section.
here's the xslt currently, its very simple as i want to understand whats going on:
I declare a property in doctType named frontPageImages which is set to the actual folder containing the images:
<xsl:variable name="imageRoot" select="$currentPage/frontPageImages"/>
heres the rest of the xslt:
<xsl:template match="/">
<xsl:variable name="mediaItems" select="umbraco.library:GetMedia($imageRoot, true())"/>
<xsl:for-each select="$mediaItems">
<xsl:variable name="picFile" select="/Image/umbracoFile"/>
<xsl:variable name="picW" select="/Image/umbracoWidth"/>
<xsl:variable name="picH" select="/Image/umbracoHeight"/>
<img>
<xsl:attribute name="src"><xsl:value-of select="$picFile"/></xsl:attribute>
</img>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
from my very little understanding the for loop is looping thru all utems in $mediaItems.
but it does not work. can any one shed any light on my cave.
>sajid
Hi Sajid,
Try changing the for-each to this...
...so you are loop through each Image.
Cheers, Lee.
Hi Lee, thanks for yr response:
still not working.
heres my xslt: slightly different from above but same scenario:
<?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"/>
<xsl:variable name="ID" select="$currentPage/frontPageImages"/>
<xsl:template match="/">
<!-- start writing XSLT -->
<xsl:if test="$ID > 0">
<xsl:variable name="mediaItems" select="umbraco.library:GetMedia($ID, true())"/>
<xsl:for-each select="$mediaItems/Image">
<img>
<xsl:attribute name="src">
<xsl:text>/umbraco/imagegen.ashx?image=</xsl:text>
<xsl:value-of select="umbracoFile"/>
<xsl:text>&width=300</xsl:text>
</xsl:attribute>
</img>
</xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Hey, Tried this?
<xsl:for-each select="$mediaItems/Folder/Image">
<!-- ..code here -->
</xsl:for-each>
or if u want images in subfolders to
<xsl:for-each select="$mediaItems//Image">
<!-- ..code here -->
</xsl:for-each>
Neils, you are a star...it worked...thank you!!!!
here is xslt working:
<xsl:variable name="imageRoot" select="$currentPage/frontPageImages"/>
<xsl:template match="/">
<xsl:variable name="mediaItems" select="umbraco.library:GetMedia($imageRoot, true())"/>
<xsl:copy-of select="$mediaItems/Image"/>
<xsl:for-each select="$mediaItems/Folder/Image">
<xsl:variable name="picFile" select="umbracoFile"/>
<xsl:variable name="picW" select="umbracoWidth"/>
<xsl:variable name="picH" select="umbracoHeight"/>
<img>
<xsl:attribute name="src"><xsl:value-of select="$picFile"/></xsl:attribute>
</img>
</xsl:for-each>
how can i get the xml for the doc so i can see the nodes generated.
again many many thanks
>sajid
if i set doc property to an image in a folder both these work.
<xsl:value-of select="umbraco.library:GetMedia($currentPage/yourImage, false())/Image/umbracoFile"/>
<xsl:value-of select="umbraco.library:GetMedia($currentPage/yourImage, false())/Folder/Image/umbracoFile"/>
so in a for loop we need to specify Folder in your post. is that correct.
>sajid
oops
bold one does not work. so if you want to get all images in a folder you need specify a for loop with Folder before Image as in Neils post above.
<xsl:value-of select="umbraco.library:GetMedia($currentPage/yourImage, false())/Image/umbracoFile"/>
<xsl:value-of select="umbraco.library:GetMedia($currentPage/yourImage, false())/Folder/Image/umbracoFile"/>
>sajid
mmm... i don't really know what you want to achieve but i think you want something like this?
<xsl:choose>
<xsl:when test="umbraco.library:GetMedia($currentPage/yourImage, 1)/node()[1]/@nodeTypeAlias = 'Image'">
<!-- parse as image -->
</xsl:when>
<xsl:otherwise>
<!-- parse as folder -->
</xsl:otherwise>
</xsl:choose>
Yes you need an for loop with a folder. This is because the folder has the images as children. So we need to loop through his children if u want to acces them.
What is posible th,o is selecting an image from its index like this:
<xsl:value-of select="umbraco.library:GetMedia($currentPage/yourImage, false())/Folder/Image[1]/umbracoFile"/>
Sorry Neils for confusing you,
What I have is a a front page with one logo. so i set a document as media picker and set to the company logo, this is where i use:
xsl:value-of select="umbraco.library:GetMedia($currentPage/yourImage, false())/Image/umbracoFile"/>
so $currentPage/yourImage is the media picker property pointing at company logo. this workd with xslt just specified in line above.
There is also an image gallery page wher i use the for loop you gave me above. This too now works after adding /Folder/Image.
so all now works A ok,
my query was that when i get the logo as in xslt line above i dont specif /Folder/Image/umbracoFile. I just need to specify /Image/umbracoFile.
where as in the for loop when i traverse thru a folder in the media sections to get all images in that folder i need to specify /Folder/Image
So what i understand is that in a for loop when getting images from a folder we use /Folder/Image, but when we are getting just one image there is no need to specify /Folder/Image/umbracoFile, we can just specify /Image/umbracoFile.
So i'm trying to get a better understanding of the syntax.
>sajid
Ah ok :) thanks for clearing out. And yes you are correct!
This is because when umbraco.library:GetMedia gives us a folder back, we acces it by /Folder.
If it gives us an image back, we acces it by /Image.
And we use a for-each loop if we want to loop through the children of an node. like when we loop trough the children nodes of the folder in /Folder/Image
thanks 4 all yr help.
when i get into problem like this is there a way to get all the xml that is generated so i can debug it?
>sajid
No problem, i'm still a xslt noob myself. I learned from this to.
Great question, getting the xml your working on ( <xsl:copy-of select=' '/> )
Like this:
<xsl:copy-of select="umbraco.library:GetMedia($currentPage/yourImage, false())"/>
thanx Neils...yr a great dude!!
I'm also converting another xslt version 4 to 4.5. It basically pulls back a random banner image when user comes back to frontpage or refreshes it.
here's the xslt. still not working in ver4.5:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet
version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:myFuncs="urn:my-scripts"
exclude-result-prefixes="msxml myFuncs umbraco.library">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<!--<xsl:variable name="imageRoot" select="$currentPage/frontPageImages"/>-->
<xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self::* [@level = 1]/* [@isDoc and string(frontPageImages) !='-1']"/>
<msxsl:script implements-prefix="myFuncs" language="JavaScript">
<![CDATA[
var myArray = new Array();
var index;
//generate random number
function generateRandom(){
return index= Math.floor(Math.random() * myArray.length);
}
//get image url from array
function getUrl(){
return myArray[index].url;
}
//get caption from array
function getCaption(){
return myArray[index].caption;
}
function addtoArray(itemUrl, itemCaption){
var item = {url: itemUrl, caption: itemCaption};
myArray.push(item);
}
]]>
</msxsl:script>
<xsl:template match="/">
<xsl:call-template name="buildArray">
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, true())/Folder/Image"/>
</xsl:call-template>
<xsl:value-of select="myFuncs:generateRandom()" />
<img>
<xsl:attribute name="src">
<xsl:text>/umbraco/imagegen.ashx?image=</xsl:text>
<xsl:value-of select="myFuncs:getUrl()"/>
<xsl:text>&width=400</xsl:text>
</xsl:attribute>
<xsl:attribute name="style">
<xsl:text>width:400px;</xsl:text>
</xsl:attribute>
</img>
<p id="caption">
<xsl:value-of select="myFuncs:getCaption()"/>
</p>
</xsl:template>
<xsl:template name="buildArray" >
<xsl:param name="arrayNodes"/>
<xsl:for-each select="$arrayNodes">
<xsl:value-of select="myFuncs:addtoArray(string(umbracoFile),string(Image/caption))"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
I dont know if this variable imageRoot is works.
<xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self::* [@level = 1]/* [@isDoc and string(frontPageImages) !='-1']"/>
But i would go for something like this :)
<xsl:param name="currentPage"/>
<xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self::* [@level = 1]/* [@isDoc and string(frontPageImages) !='-1']"/>
<xsl:template match="/">
<xsl:variable name="randomImageNumber" select="ceiling( Exslt.ExsltMath:random() * count(umbraco.library:GetMedia($imageRoot, 1)/Folder/Image) )"/>
<xsl:variable name="theImage" select="umbraco.library:GetMedia($imageRoot, 1)/Folder/Image[$randomImageNumber]"/>
<img>
<xsl:attribute name="src">
<xsl:text>/umbraco/imagegen.ashx?image=</xsl:text>
<xsl:value-of select="$theImage/umbracoFile"/>
<xsl:text>&width=400</xsl:text>
</xsl:attribute>
<xsl:attribute name="style">
<xsl:text>width:400px;</xsl:text>
</xsl:attribute>
</img>
<p id="caption">
<xsl:value-of select="$theImage/caption"/>
</p>
</xsl:template>
Neils amazing...
heres what i did and it works, only problem is tries to bring back 3 images when the folder only contains 2 so one of the images says hello world.
The xslt is below and it works:
i think i need to change something so it only brings back image nodes not sure what yet: your xslt seems far better let me try it out.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet
version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:myFuncs="urn:my-scripts"
exclude-result-prefixes="msxml myFuncs umbraco.library">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<xsl:variable name="imageRoot" select="$currentPage/frontPageImages"/>
<msxsl:script implements-prefix="myFuncs" language="JavaScript">
<![CDATA[
var myArray = new Array();
var index;
//generate random number
function generateRandom(){
index= Math.floor(Math.random() * myArray.length);
}
function addtoArray(itemUrl, itemCaption){
var item = {url: itemUrl, caption: itemCaption};
myArray.push(item);
}
//get image url from array
function getUrl(){
return myArray[index].url;
}
//get caption from array
function getCaption(){
return myArray[index].caption;
}
]]>
</msxsl:script>
<xsl:template match="/">
<xsl:call-template name="buildArray">
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, true())/Folder/*"/>
</xsl:call-template>
<xsl:value-of select="myFuncs:generateRandom()" />
<xsl:element name="img">
<xsl:attribute name="src">
<xsl:text>/umbraco/imagegen.ashx?image=</xsl:text>
<xsl:value-of select="myFuncs:getUrl()"/>
<xsl:text>&width=200</xsl:text>
</xsl:attribute>
<xsl:attribute name="style">
<xsl:text>width:400px;</xsl:text>
</xsl:attribute>
</xsl:element>
<p id="caption">
<xsl:value-of select="myFuncs:getCaption()"/>
</p>
</xsl:template>
<xsl:template name="buildArray" >
<xsl:param name="arrayNodes"/>
<xsl:for-each select="$arrayNodes">
<xsl:value-of select="myFuncs:addtoArray(string(umbracoFile),string(caption))"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
thx :)
maybe try this
//generate random number
function generateRandom(){
index= Math.floor(Math.random() * myArray.length); // change myArray.length to (myArray.length-1)
}
so you would get
//generate random number
function generateRandom(){
index= Math.floor(Math.random() * (myArray.length-1));
}
necessary since in your code Math.Random generates between 0-1. you multiply it with 2 wich means you get 0,1,2 = 3 images,
changing it to multiply with 1 less gets you 0,1 = 2 images
::edit::
Sorry i was wrong, this is needed when u use xstl indexes. (xslt begins on 1, javascript on 0)Hey Neils thanx for all yr help in this...its getting late on friday but you still helping...U r kool.
i've posted my original ver4 xslt below which exact same job but no hello world image:
I'm wondering if its anything to do with the imageRoot selction. I mean could it be trying to convert the frontPageImages folder into a image and hence the helloworld image.
here how i define imageRoot:
<xsl:variable name="imageRoot" select="$currentPage/frontPageImages"/>
and heres how i traverse thru its contents:
<xsl:call-template name="buildArray">
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, true())/Folder/*"/>
</xsl:call-template>
I did try /Folder/Image but error was javascript getUrl undefined
but myarray,length - 1 does not work as it brings back only one of the images and the helloworld image.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:Stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet
version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:myFuncs="urn:my-scripts"
exclude-result-prefixes="msxml myFuncs umbraco.library">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="currentPage"/>
<xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self:: node[@level = 1]/data [@alias = 'frontPageImages']"/>
<msxsl:script implements-prefix="myFuncs" language="JavaScript">
<![CDATA[
var myArray = new Array();
var index;
//generate random number
function generateRandom(){
index= Math.floor(Math.random() * myArray.length);
}
//get image url from array
function getUrl(){
return myArray[index].url;
}
//get caption from array
function getCaption(){
return myArray[index].caption;
}
function addtoArray(itemUrl, itemCaption){
var item = {url: itemUrl, caption: itemCaption};
myArray.push(item);
}
]]>
</msxsl:script>
<xsl:template match="/">
<xsl:call-template name="buildArray">
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, 'true')/node"/>
</xsl:call-template>
<xsl:value-of select="myFuncs:generateRandom()" />
<img>
<xsl:attribute name="src">
<xsl:text>/umbraco/imagegen.ashx?image=</xsl:text>
<xsl:value-of select="myFuncs:getUrl()"/>
<xsl:text>&width=400</xsl:text>
</xsl:attribute>
<xsl:attribute name="style">
<xsl:text>width:400px;</xsl:text>
</xsl:attribute>
</img>
<p id="caption">
<xsl:value-of select="myFuncs:getCaption()"/>
</p>
</xsl:template>
<xsl:template name="buildArray" >
<xsl:param name="arrayNodes"/>
<xsl:for-each select="$arrayNodes">
<xsl:value-of select="myFuncs:addtoArray(string(./data[@alias='umbracoFile']),string(./data[@alias='caption']))"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Hi Neils,
In the original v4 xslt I had:
<xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self:: node[@level = 1]/data [@alias = 'frontPageImages']"/>
in the v4.5 ver i have translated above to:
<xsl:variable name="imageRoot" select="$currentPage/frontPageImages"/>
not sure may be i should also have the level?
>sajid
ok a temprary fix:
//generate random number
function generateRandom(){
index= Math.floor(Math.random() * myArray.length);
if (index == 0){
index = 1;
}
}
when index == 0 is when hello world is shown.
if i obly have 2 images myarray.length should be 2 not 3...hmmm?
>sajid
[empty]
Hey,
Oh i Remember now :)
if you us xsl:copy-of on the umbraco.library:GetMedia($imageRoot, true())
U can see that the /Folder has more children than just Image or File. it also has an empty <contents></contents> child.
Wich explains the third child.
So i think that this would work:
<xsl:call-template name="buildArray">
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, true())/Folder/Image"/>
</xsl:call-template>
An more ugly fix would be:
<xsl:for-each select="$arrayNodes">
<xsl:if test="@nodeTypeAlias = 'Image' "'>
<xsl:value-of select="myFuncs:addtoArray(string(umbracoFile),string(caption))"/>
</xsl:if>
</xsl:for-each>
As for the selector
<xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self:: node[@level = 1]/data [@alias = 'frontPageImages']"/>
i would make that
<xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self:: * [@isDoc][@level = 1]/frontPageImages"/>
*note. A handy tool for converting:
blackpoint.dk/.../convert-xml-schema-to-45-.aspx
hi Neils
using /Folder/Image results in error:
or the alternative xslt results in:
Microsoft.JScript.JScriptException: Object required
at Microsoft.JScript.Convert.ToObject(Object value, VsaEngine engine)
at System.Xml.Xsl.CompiledQuery.Script129.getUrl()
how do i use: "@nodeTypeAlias = 'Image' at time of selection like with this:
<xsl:variable name="imageRoot" select="$currentPage/frontPageImages"/>
i also tried
<xsl:variable name="imageRoot" select="$currentPage/frontPageImages [ Not @isDoc]"/>
as I thought maybe the actual containing folder was also going thru.
but error on that too.
>sajid
Hey
U can try this for the nodes selector
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, true())/Folder/* [@nodeTypeAlias = 'Image']"/>
Conversion tool is excellent, but it gave save javascript error on:
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, 'true')/* [@isDoc]"
if i chnage to
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, 'true')/Folder/*"
its ok.
Hey Neils, even with Nodes selector you kindly posted above get error:
Microsoft.JScript.JScriptException: Object required
at Microsoft.JScript.Convert.ToObject(Object value, VsaEngine engine)
at System.Xml.Xsl.CompiledQuery.Script149.getUrl()
looks like all the possibilities to prevent the content node from being passed thru to addToArray are being blocked by this error.
>sajid
Hey Sajid,
Ok I went to umbraco and tested your code, runs with no errors here :O (with /Folder/Image)
Ofcourse i diddnt use your imageRoot variable, i just used a NodeId
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:Stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet
version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:myFuncs="urn:my-scripts"
exclude-result-prefixes="msxml myFuncs umbraco.library">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="currentPage"/>
<xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self:: * [@isDoc][@level = 1]/frontPageImages"/>
<msxsl:script implements-prefix="myFuncs" language="JavaScript">
<![CDATA[
var myArray = new Array();
var index;
//generate random number
function generateRandom(){
index= Math.floor(Math.random() * myArray.length);
}
//get image url from array
function getUrl(){
return myArray[index].url;
}
//get caption from array
function getCaption(){
return myArray[index].caption;
}
function addtoArray(itemUrl, itemCaption){
var item = {url: itemUrl, caption: itemCaption};
myArray.push(item);
}
]]>
</msxsl:script>
<xsl:template match="/">
<xsl:call-template name="buildArray">
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, 'true')/Folder/Image"/>
</xsl:call-template>
<xsl:value-of select="myFuncs:generateRandom()" />
<img>
<xsl:attribute name="src">
<xsl:text>/umbraco/imagegen.ashx?image=</xsl:text>
<xsl:value-of select="myFuncs:getUrl()"/>
<xsl:text>&width=400</xsl:text>
</xsl:attribute>
<xsl:attribute name="style">
<xsl:text>width:400px;</xsl:text>
</xsl:attribute>
</img>
<p id="caption">
<xsl:value-of select="myFuncs:getCaption()"/>
</p>
</xsl:template>
<xsl:template name="buildArray" >
<xsl:param name="arrayNodes"/>
<xsl:for-each select="$arrayNodes">
<xsl:value-of select="myFuncs:addtoArray(string(./umbracoFile),string(./caption))"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
An other option is to just keep the code when it worked but added 3
elements to the array and filter the contents node like this
ok Neil will try the javascript option
can you tell me in my xslt how can i get the complete xml doc returned so i can see all nodes?
oh yeah I tried the xslt to kindly posted above. but same error pinting at javascript getURL:
but ok will try function above...other wise it does work if index is not 0.
thanks ever so much for all yr kind efforts ;-)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet
version="1.0"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:myFuncs="urn:my-scripts"
exclude-result-prefixes="msxml myFuncs umbraco.library" >
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="currentPage"/>
<xsl:variable name="imageRoot" select="$currentPage/ancestor-or-self:: * [@isDoc][@level = 1]/frontPageImages"/>
<msxsl:script implements-prefix="myFuncs" language="JavaScript">
<![CDATA[
var myArray = new Array();
var index;
//generate random number
function generateRandom(){
index= Math.floor(Math.random() * myArray.length);
//array lenth is 3 as we 2 images and an empty content folder.
if (index == 0){
index = 1;
}
}
function addtoArray(itemUrl, itemCaption){
var item = {url: itemUrl, caption: itemCaption};
myArray.push(item);
}
//get image url from array
function getUrl(){
return myArray[index].url;
}
//get caption from array
function getCaption(){
return myArray[index].caption;
}
]]>
</msxsl:script>
<xsl:template match="/">
<xsl:call-template name="buildArray">
<xsl:with-param name="arrayNodes" select="umbraco.library:GetMedia($imageRoot, 'true')/Folder/Image"/>
</xsl:call-template>
<!--<xsl:element name="img">-->
<img>
<xsl:attribute name="src">
<xsl:text>/umbraco/imagegen.ashx?image=</xsl:text>
<xsl:value-of select="myFuncs:getUrl()"/>
<xsl:text>&width=200</xsl:text>
</xsl:attribute>
<xsl:attribute name="style">
<xsl:text>width:400px;</xsl:text>
</xsl:attribute>
</img>
<!--</xsl:element>-->
<p id="caption">
<xsl:value-of select="myFuncs:getCaption()"/>
</p>
</xsl:template>
<xsl:template name="buildArray" >
<xsl:param name="arrayNodes"/>
<xsl:for-each select="$arrayNodes">
<xsl:value-of select="myFuncs:addtoArray(string(./umbracoFile),string(./caption))"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Hi Niels and Sajid
Just wanted to thank you for assisting me with building an xslt that gets all images in a folder selected with mediaPicker.
I'll then use jQuery cycle plugin to shuffle the frontpage image each time a user visits or refreshes.
My xslt (hope to help others):
Of course the <textarea> is for testing purposes.
Hi all, is there a way of getting media images from a media folder to display where the media folder = the media folder selected by a media picker on a content node?
Hi Roger,
You'll have much better luck with creating a new topic with your question.
It's also easier for others to find an actual solution to a problem, since only a single reply can be marked as the answer.
/Chriztian
is working on a reply...