Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Phil Crowe 192 posts 256 karma points
    Jan 04, 2011 @ 10:11
    Phil Crowe
    0

    check if node does exist

    something funny seems to be going on with my xslt. i have a for-each loop that occasionally breaks and i have found the bug to be some nodes are referencing the incorrect parentid. if i write out the value-of the parentid it says 'no node is located at id ..blah blah' and when i check in umbraco the actual parent of the node showing the error has a different parent id!

    so I overcome this is want to check the node does exist before i reference it, i read that checking if the @path has -1 tells you if it exsists, but this seems to be incorrect because all more nodes have a path containing -1. 'contains($granparent/@path, '-1')'

    So how else can i check this?

  • Kim Andersen 1447 posts 2197 karma points MVP
    Jan 04, 2011 @ 10:12
    Kim Andersen
    0

    Hi Phil

    Can you show us your XSLT where this happens?

    /Kim A

  • Phil Crowe 192 posts 256 karma points
    Jan 04, 2011 @ 10:30
    Phil Crowe
    0

    hi kim, kind of a big file but here it is:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE xsl:stylesheet [

      <!ENTITY nbsp "&#x00A0;">

    ]>

    <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 myfunctionlib"

     

      xmlns:myfunctionlib="urn:myfunctionlib"

      xmlns:PS.Helpers="urn:PS.Helpers"

      >

     

     

    <msxml:script implements-prefix="myfunctionlib" language="C#" >

     

    <![CDATA[

    Random r = new Random();

    public int RandomPos(int max) {

        return r.Next(max) + 1;

    }

    ]]>

    </msxml:script>

     

    <xsl:output method="xml" omit-xml-declaration="yes"/>

     

    <xsl:param name="currentPage"/>

    <xsl:variable name="source" select="/macro/source"/>

    <xsl:variable name="maxresults" select="/macro/MaxResults" />

     

    <xsl:template match="/">

     

     

     

      <img src="/images/my-collection/black-up.jpg" id="mycollup" />

      <ul>

        <xsl:choose>

          <xsl:when test="string-length(umbraco.library:RequestQueryString('hasSearchTerm')) &gt; 0">

     

                <xsl:call-template name="displaySearchedRows">

     

                  <xsl:with-param name="searchedTerm" select="umbraco.library:RequestQueryString('hasSearchTerm')" />

                  <xsl:with-param name="counter" select="1" />

                  <!--max rows is all the comment nodes under the product node-->

                <xsl:with-param name="maxrows" select="4" />

                </xsl:call-template>

     

         </xsl:when>

         <xsl:otherwise>

        <xsl:call-template name="displayrow">

     

        <xsl:with-param name="counter" select="1" />

        <xsl:with-param name="maxrows" select="$maxresults" />

        </xsl:call-template>

          </xsl:otherwise>

     

        </xsl:choose>

      </ul>

      <img src="/images/my-collection/black-down.jpg" id="mycolldown" />

     

    </xsl:template>

     

        <xsl:template name="displayrow">

          <xsl:param name="counter" />

          <xsl:param name="maxrows" />

          <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />

          <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

            <xsl:variable name="randomnode" select="umbraco.library:GetXmlNodeById($source)//TextImageData[position()=myfunctionlib:RandomPos($maxrows)]"/>

             <xsl:value-of select="randomnode"/>

     

     

                                 <xsl:choose>

              <xsl:when test="$randomnode/member != ''">

                <li class="licomment">

     

                <xsl:variable name="mxml" select="umbraco.library:GetMember($randomnode/member)" />

                <div class="myCollectionLatest" id="mycollectioncomment{$counter}">

                  <div style="float:left;">

                    <div class="colltoppic">

                      <a href="/my-collection.aspx?memberId={$mxml/*/@id}">

                <img src="{$mxml/node/profilePicture}" width="74" height="74" onerror="ImgError(this);" />

     

                      </a>

                    </div>

     

                    <div style="float:left; position:absolute; margin-left:83px; margin-top:-84px; width:160px;" class="mycolllatestlinks">

     

                        <b>

                          <xsl:variable name="parent" select="$randomnode/@parentID">

     

                            </xsl:variable>

                            <xsl:variable name="granparent" select="umbraco.library:GetXmlNodeById(umbraco.library:GetXmlNodeById($parent)/@parentID)" />

    <xsl:value-of select="$granparent">

    <xsl:choose>

    <!--this is the check to see if a gran-parent exsists, currently some nodes reference an incorrect parent id-->

    <xsl:when test="contains($granparent/@path, '-1')">

    <a href="/my-collection.aspx?memberId={$mxml/*/@id}" class="usernamelinkdiv">

    <xsl:value-of select="translate($mxml/node/screenName, $smallcase, $uppercase)"/>

    </a> SAID 

    </xsl:when>

    <xsl:otherwise>

    <xsl:choose>

    <xsl:when test="string-length($granparent/@nodeName) &gt; 0">

    <a href="/my-collection.aspx?memberId={$mxml/*/@id}" class="usernamelinkdiv">

    <xsl:value-of select="translate($mxml/node/screenName, $smallcase, $uppercase)"/>

    </a> SAID ABOUT

     

    <span class="pinkTxt">

     

    <br />

     

    <xsl:choose>

    <xsl:when test="name($granparent) = 'ProductCategory'">

    <a href="{umbraco.library:NiceUrl($granparent/@id)}?categoryId=1">

    <xsl:value-of select="translate($granparent/@nodeName, $smallcase, $uppercase)"/>

    </a>

    </xsl:when>

    <xsl:when test="name($granparent) = 'ProductSubCategory'">

    <a href="{umbraco.library:NiceUrl($granparent/@id)}?searchingForProduct=1">

    <xsl:value-of select="translate($granparent/@nodeName, $smallcase, $uppercase)"/>

    </a>

    </xsl:when>

    <xsl:otherwise>

    <a href="{umbraco.library:NiceUrl($granparent/@id)}">

    <xsl:value-of select="translate(umbraco.library:GetXmlNodeById($granparent)/@nodeName, $smallcase, $uppercase)"/>

    </a>

    </xsl:otherwise>

     

    </xsl:choose>

     

    </span>

    </xsl:when>

     

    <xsl:otherwise>

    <a href="/my-collection.aspx?memberId={$mxml/*/@id}">

    <xsl:value-of select="translate($mxml/node/screenName, $smallcase, $uppercase)"/>

    </a> SAID

    </xsl:otherwise>

    </xsl:choose>

    <!--add this because some comments didnt seem to have a product against them-->

    </xsl:otherwise>

    </xsl:choose>

                        </b>

     

                      <p>

                      <xsl:value-of select="substring(umbraco.library:StripHtml($randomnode/text),1,60)" />...

                    </p>

     

                    </div>

                    <div class="randomCommentsSeeMore">

                      <span class="pinkTxt">

                        <a href="/my-collection.aspx?memberId={$mxml/*/@id}">

                          See more <img src="/images/navControls/more-arrow.jpg" alt="see more" />

                        </a>

                    </span>

                    </div>

                  </div>

     

                </div>

     

     

              </li>

                <xsl:if test="$counter &lt; $maxrows">

     

                  <xsl:call-template name="displayrow">

                    <xsl:with-param name="counter" select="$counter + 1" />

                    <xsl:with-param name="maxrows" select="$maxrows" />

                  </xsl:call-template>

     

                </xsl:if>

           </xsl:when>

          <xsl:when test="$randomnode/member = ''">

            <xsl:if test="$counter &lt; $maxrows">

     

              <xsl:call-template name="displayrow">

                <xsl:with-param name="counter" select="$counter" />

                <xsl:with-param name="maxrows" select="$maxrows" />

              </xsl:call-template>

     

            </xsl:if>

          </xsl:when>

          <xsl:otherwise>

            <xsl:if test="$counter &lt; $maxrows">

     

              <xsl:call-template name="displayrow">

                <xsl:with-param name="counter" select="$counter" />

                <xsl:with-param name="maxrows" select="$maxrows" />

              </xsl:call-template>

     

            </xsl:if>        

          </xsl:otherwise>

          </xsl:choose>

        </xsl:template>

      <xsl:template name="displaySearchedRows">

        <xsl:param name="counter" />

        <xsl:param name="maxrows" />

        <xsl:param name="searchedTerm" />

     

        <xsl:variable name="returnedSearchedString" select="PS.Helpers:MemberListString($searchedTerm)"/>

     

      <!--  umbraco.library:Split($products, ',') -->

        <xsl:variable name="splitMemberNodes" select="umbraco.library:Split($returnedSearchedString, ',')" />

      <xsl:for-each select="$splitMemberNodes/value">

     

     

          <li class="licomment">

     

            <xsl:if test="string-length(.) &gt; 0">

              <xsl:variable name="mxml" select="umbraco.library:GetMember(.)" />

     

     

     

     

              <div class="myCollectionLatest" id="mycollectioncomment{position()}">

                <div style="float:left;">

                  <div class="colltoppic">

                    <a href="/my-collection.aspx?memberId={$mxml/*/@id}">

                      <img src="{$mxml/node/profilePicture}" width="74" height="74" onerror="ImgError(this);" />

     

                    </a>

                  </div>

                  <div class="collbottompic">

                  </div>

                  <div style="float:left; position:absolute; margin-left:83px; margin-top:-84px;" class="mycolllatestlinks">

     

                    <b>

                      <xsl:variable name="parent" select="@parentID">

     

                      </xsl:variable>

                      <xsl:variable name="granparent" select="umbraco.library:GetXmlNodeById(umbraco.library:GetXmlNodeById($parent)/@parentID)" />

                      <xsl:choose>

                        <xsl:when test="string-length($granparent/@nodeName) &gt; 0">

                          <a href="/my-collection.aspx?memberId={$mxml/*/@id}" class="usernamelinkdiv">

                            <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />

                            <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

                            <xsl:value-of select="translate($mxml/node/screenName, $smallcase, $uppercase)"/>

                          </a> 

     

                          <span class="pinkTxt">

     

                            <br />

                            <a href="{umbraco.library:NiceUrl($granparent/@id)}">

                              <xsl:value-of select="$granparent/@nodeName"/>

                            </a>

     

                          </span>

                        </xsl:when>

     

                        <xsl:otherwise>

                          <a href="/my-collection.aspx?memberId={$mxml/*/@id}">

                            <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />

                            <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

                            <xsl:value-of select="translate($mxml/node/screenName, $smallcase, $uppercase)"/>

                          </a> 

                        </xsl:otherwise>

                      </xsl:choose>

     

                    </b>

     

                    <p>

                      <xsl:if test="string-length($mxml/node/makeUpIdol) &lt; 1" >

                        <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />

                        <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

                        <xsl:value-of select="translate($mxml/node/screenName, $smallcase, $uppercase)"/> HAS NOT GOT A MAKEUP IDOL

                      </xsl:if>

                      <xsl:value-of select="$mxml/node/makeUpIdol"/>

                    </p>

     

                  </div>

                  <div class="randomCommentsSeeMore">

                    <span class="pinkTxt">

                      <a href="/my-collection.aspx?memberId={$mxml/*/@id}">

                        See more <img src="/images/navControls/more-arrow.jpg" alt="see more" />

                      </a>

                    </span>

                  </div>

                </div>

     

              </div>

     

     

            </xsl:if>

            </li>

     

            <!-- <xsl:variable name="randomnode" select="umbraco.library:GetXmlNodeById($source)//TextImageData[position()=myfunctionlib:RandomPos($maxrows)]"/>-->

     

        </xsl:for-each>

     

     

      </xsl:template>

    </xsl:stylesheet>

     

    I have highlighted in bold where the error occurs.

  • Thijs Kuipers 43 posts 66 karma points
    Jan 04, 2011 @ 12:03
    Thijs Kuipers
    0

    Hi Phil, first off: what's the deal with all the "translate(), smallcase, uppercase" stuff? Doesn't "upper-case()" work? (I seriously don't know, you might have tested this and found it doesn't).

    Second, I don't know where your error stems from, but I often use an XSLT-only construct to find a node by id:

    <!-- Get the absolute root -->
    <xsl:variable name="rootNode" select="$currentPage/ancestor::root"/>
    
    <!-- Get a node by id -->
    <xsl:variable name="selectNode" select="$rootNode//*[@id = $requestedId]"/>
  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies