Since there are changes in 4.5 xsl engine the 1.0.1 version does not work. I had to make 2 changes.
1st: I had to change the xslt ended up lookin like this:
<?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"
xmlns:tagsLib="urn:tagsLib"
xmlns:BlogLibrary="urn:BlogLibrary"
exclude-result-prefixes="msxml
umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes
Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings
Exslt.ExsltSets tagsLib BlogLibrary "> <xsl:output method="xml" omit-xml-declaration="yes"/> <xsl:param name="currentPage"/> <xsl:variable
name="urlPrefix"> <xsl:text>http://</xsl:text> <xsl:value-of
select="umbraco.library:RequestServerVariables('HTTP_HOST')"
/> </xsl:variable> <!-- update this variable on how deep your site
map should be --> <xsl:variable name="maxLevelForSitemap"
select="8"/> <xsl:template match="/"> <!-- change the mimetype for the current page to
xml --> <xsl:value-of
select="umbraco.library:ChangeContentType('text/xml')"/> <xsl:call-template
name="drawNodes"> <!--<xsl:with-param name="parent"
select="$currentPage/ancestor-or-self::node [@level=1]"/>--> <xsl:with-param name="parent" select="$currentPage/ancestor-or-self::* [@level=1 and
@isDoc]"/> </xsl:call-template> </xsl:template> <xsl:template
name="drawNodes"> <xsl:param name="parent"/> <xsl:if test="umbraco.library:IsProtected($parent/@id,
$parent/@path) = 0 or (umbraco.library:IsProtected($parent/@id,
$parent/@path) = 1 and umbraco.library:IsLoggedOn() = 1)"> <xsl:for-each
select="$parent/*
[@isDoc and string(./umbracoNaviHide) != '1' and @level <=
$maxLevelForSitemap]"> <!-- If the
document does not have a template, nothing is shown in the frontend
anyway. So this is not proper content and should not be in
the sitemap --> <xsl:if test="@template > 0"> <url> <loc><xsl:value-of select="$urlPrefix"
/><xsl:value-of
select="umbraco.library:NiceUrl(@id)"
/></loc> <lastmod><xsl:value-of select="umbraco.library:FormatDateTime(@updateDate,
'yyyy-MM-ddThh:mm:ss+00:00')" /></lastmod> <xsl:if test="./data [@alias='searchEngineSitemapChangeFreq']
!= ''"> <changefreq><xsl:value-of
select="./data
[@alias='searchEngineSitemapChangeFreq']" /></changefreq> </xsl:if> <xsl:if test="./data
[@alias='searchEngineSitemapPriority'] != ''"> <priority><xsl:value-of select="./data
[@alias='searchEngineSitemapPriority']" /></priority> </xsl:if> </url> </xsl:if> <xsl:if test="count(./node
[string(./data [@alias='umbracoNaviHide']) != '1' and @level <=
$maxLevelForSitemap]) > 0">
<xsl:call-template
name="drawNodes"> <xsl:with-param name="parent" select="."/> </xsl:call-template> </xsl:if> </xsl:for-each> </xsl:if> </xsl:template> </xsl:stylesheet>
2nd: A space is introduced at the top of the xml sitemap so it doesn't validate in browsers. I ended up taking out all the line breaks in the CultivSearchEngineSitemap template so it would validate (the templates looks as if it is minified...all on one line).
Any other whitespace is fine, but this one is indeed essential. When you install the package, it already sets up the Template/masterpage correctly for you.
Actually there is an error in Eric's code. The last if-test in his code is not updated for the new schema.
I have updated the code, and added the possibillity of also getting the very top node in your site map. That is if your content is structured like this:
CONTENT -- Homepage ----- Subpage -------- Sub-subpage ----- Subpage etc.
Getting to work in v4.5
Since there are changes in 4.5 xsl engine the 1.0.1 version does not work. I had to make 2 changes.
1st: I had to change the xslt ended up lookin like this:
<?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" xmlns:tagsLib="urn:tagsLib" xmlns:BlogLibrary="urn:BlogLibrary"
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets tagsLib BlogLibrary ">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<xsl:variable name="urlPrefix">
<xsl:text>http://</xsl:text>
<xsl:value-of select="umbraco.library:RequestServerVariables('HTTP_HOST')" />
</xsl:variable>
<!-- update this variable on how deep your site map should be -->
<xsl:variable name="maxLevelForSitemap" select="8"/>
<xsl:template match="/">
<!-- change the mimetype for the current page to xml -->
<xsl:value-of select="umbraco.library:ChangeContentType('text/xml')"/>
<xsl:call-template name="drawNodes">
<!--<xsl:with-param name="parent" select="$currentPage/ancestor-or-self::node [@level=1]"/>-->
<xsl:with-param name="parent" select="$currentPage/ancestor-or-self::* [@level=1 and @isDoc]"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="drawNodes">
<xsl:param name="parent"/>
<xsl:if test="umbraco.library:IsProtected($parent/@id, $parent/@path) = 0 or (umbraco.library:IsProtected($parent/@id, $parent/@path) = 1 and umbraco.library:IsLoggedOn() = 1)">
<xsl:for-each select="$parent/* [@isDoc and string(./umbracoNaviHide) != '1' and @level <= $maxLevelForSitemap]">
<!-- If the document does not have a template, nothing is shown in the frontend anyway.
So this is not proper content and should not be in the sitemap -->
<xsl:if test="@template > 0">
<url>
<loc><xsl:value-of select="$urlPrefix" /><xsl:value-of select="umbraco.library:NiceUrl(@id)" /></loc>
<lastmod><xsl:value-of select="umbraco.library:FormatDateTime(@updateDate, 'yyyy-MM-ddThh:mm:ss+00:00')" /></lastmod>
<xsl:if test="./data [@alias='searchEngineSitemapChangeFreq'] != ''">
<changefreq><xsl:value-of select="./data [@alias='searchEngineSitemapChangeFreq']" /></changefreq>
</xsl:if>
<xsl:if test="./data [@alias='searchEngineSitemapPriority'] != ''">
<priority><xsl:value-of select="./data [@alias='searchEngineSitemapPriority']" /></priority>
</xsl:if>
</url>
</xsl:if>
<xsl:if test="count(./node [string(./data [@alias='umbracoNaviHide']) != '1' and @level <= $maxLevelForSitemap]) > 0">
<xsl:call-template name="drawNodes">
<xsl:with-param name="parent" select="."/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
2nd: A space is introduced at the top of the xml sitemap so it doesn't validate in browsers. I ended up taking out all the line breaks in the CultivSearchEngineSitemap template so it would validate (the templates looks as if it is minified...all on one line).
Thanks
Eric
Thanks Eric, I plan to look at it some time soon, this is a great starting point!
The only whitespace you'd (unfortunately) have to remove is the one between the "asp:Content" opening tag and the "xml" tag, like so:
Any other whitespace is fine, but this one is indeed essential. When you install the package, it already sets up the Template/masterpage correctly for you.
Hi Eric and Sebastian,
Actually there is an error in Eric's code. The last if-test in his code is not updated for the new schema.
I have updated the code, and added the possibillity of also getting the very top node in your site map. That is if your content is structured like this:
CONTENT
-- Homepage
----- Subpage
-------- Sub-subpage
----- Subpage
etc.
Here's the code - cheers! Best regards, hundebol!
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" xmlns:tagsLib="urn:tagsLib" xmlns:BlogLibrary="urn:BlogLibrary"
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets tagsLib BlogLibrary ">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<xsl:variable name="urlPrefix">
<xsl:text>http://xsl:text>
<xsl:value-of select="umbraco.library:RequestServerVariables('HTTP_HOST')" />
xsl:variable>
<xsl:variable name="maxLevelForSitemap" select="6"/>
<xsl:variable name="url" select="concat('http://',umbraco.library:RequestServerVariables('HTTP_HOST'))" />
<xsl:template match="/">
<xsl:value-of select="umbraco.library:ChangeContentType('text/xml')"/>
<url>
<loc>
<xsl:value-of select="concat($url,'/')"/>
loc>
<lastmod>
<xsl:value-of select="concat($currentPage/ancestor-or-self::* [@level=1]/@updateDate,'+00:00')" />
lastmod>
url>
<xsl:call-template name="drawNodes">
<xsl:with-param name="parent" select="$currentPage/ancestor-or-self::* [@level=1 and @isDoc]"/>
xsl:call-template>
xsl:template>
<xsl:template name="drawNodes">
<xsl:param name="parent"/>
<xsl:if test="umbraco.library:IsProtected($parent/@id, $parent/@path) = 0 or (umbraco.library:IsProtected($parent/@id, $parent/@path) = 1 and umbraco.library:IsLoggedOn() = 1)">
<xsl:for-each select="$parent/* [@isDoc and string(umbracoNaviHide) != '1' and @level <= $maxLevelForSitemap]">
<xsl:if test="@template > 0">
<url>
<loc><xsl:value-of select="$urlPrefix" /><xsl:value-of select="umbraco.library:NiceUrl(@id)" />loc>
<lastmod><xsl:value-of select="umbraco.library:FormatDateTime(@updateDate, 'yyyy-MM-ddThh:mm:ss+00:00')" />lastmod>
<xsl:if test="./data [@alias='searchEngineSitemapChangeFreq'] != ''">
<changefreq><xsl:value-of select="./data [@alias='searchEngineSitemapChangeFreq']" />changefreq>
xsl:if>
<xsl:if test="./data [@alias='searchEngineSitemapPriority'] != ''">
<priority><xsl:value-of select="./data [@alias='searchEngineSitemapPriority']" />priority>
xsl:if>
url>
xsl:if>
<xsl:if test="count(./* [@isDoc and string(umbracoNaviHide) != '1' and @level <= $maxLevelForSitemap]) > 0">
<xsl:call-template name="drawNodes">
<xsl:with-param name="parent" select="."/>
xsl:call-template>
xsl:if>
xsl:for-each>
xsl:if>
xsl:template>
xsl:stylesheet>
@Hundebol...good catch, thanks! I'll update my code...I didn't catch that.
Thanks
Eric
A new version of the package is available that has support for both the legacy and new xml schema in the same xslt file. I recommend using that one.
is working on a reply...