Ссылка на PDF из меню - PullRequest
2 голосов
/ 22 марта 2012
    <?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 ">

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

<xsl:param name="currentPage"/>
<xsl:variable name="MediaNodeId" select="./@id"/>
<!-- Input the documenttype you want here -->
<xsl:variable name="level" select="1"/>

<xsl:template match="/">

<!-- The fun starts here -->
<ul class=" menu nav">
<xsl:for-each select="$currentPage/ancestor-or-self::* [@level=$level]/* [@isDoc and string(umbracoNaviHide) != '1']">
  <li>
    <a href="{umbraco.library:NiceUrl(@id)}">
      <xsl:value-of select="@nodeName"/>
    </a>
    <xsl:if test="count(./child::*[@isDoc and string(umbracoNaviHide) != '1']) &gt; 0">
      <ul>
        <xsl:for-each select="./child::*[@isDoc and string(umbracoNaviHide) != '1']">
          <li>
            <xsl:choose>

                <xsl:when test="name()= 'Link' ">

                <xsl:if test="linkUrl!=''">
                   <a href="{umbraco.library:GetMedia(linkUrl, 0)/umbracoFile}" target="_blank">
                     <xsl:value-of select="@nodeName"/></a>
              </xsl:if>
                </xsl:when>         

               <xsl:otherwise>
                <a href="{umbraco.library:NiceUrl(@id)}">
                <xsl:value-of select="@nodeName"/></a>
              </xsl:otherwise>

           </xsl:choose>   

             <xsl:if test="count(./child::*[@isDoc and string(umbracoNaviHide) != '2']) &gt; 0">
      <ul>
        <xsl:for-each select="./child::*[@isDoc and string(umbracoNaviHide) != '2']">
          <li>
            <a href="{umbraco.library:NiceUrl(@id)}">
              <xsl:value-of select="@nodeName"/>
            </a>
          </li>
        </xsl:for-each>
      </ul>  
    </xsl:if>
          </li>
        </xsl:for-each>
      </ul>  
    </xsl:if>
  </li>
</xsl:for-each>
</ul>
<div id="jflanguageselection"><div class="rawimages"><span id="active_language"><a href="http://www.hooymans-duivensport.nl/nl"><img src="/images/nl.gif" alt="Nederlands (NL-nl)" title="Nederlands (NL-nl)" /></a></span><span><a href="http://www.hooymans-duivensport.nl/en"><img src="/images/en.gif" alt="English (United Kingdom)" title="English (United Kingdom)" /></a></span></div></div>
</xsl:template>

</xsl:stylesheet>

Мне нужно сделать ссылку в меню на файл pdf, я получаю эту ошибку.

Произошла ошибка

System.OverflowException: значение было слишком большим или слишком маленьким для Int32. в System.Convert.ToInt32 (двойное значение) в System.Convert.ChangeType (значение объекта, тип преобразование типа, поставщик IFormatProvider) в System.Xml.Xsl.Runtime.XmlQueryRuntime.ChangeTypeXsltArgument (XmlQueryType xmlType, значение объекта, тип destinationType) в System.Xml.Xsl.Runtime.XmlQueryContext.InvokeXsltLateBoundFunction (имя строки, имя строки StringUri, аргументы IList`1 []) at (среда выполнения XmlQueryRuntime {urn: schemas-microsoft-com: xslt-debug}) в корне (время выполнения XmlQueryRuntime {urn: schemas-microsoft-com: xslt-debug}) в System.Xml.Xsl.XmlILCommand.Execute (Объект defaultDocument, источники данных XmlResolver, XsltArgumentList argumentsList, средство записи XmlWriter) в System.Xml.Xsl.XslCompiledTransform.Transform (вход IXPathNavigable, аргументы XsltArgumentList, результаты TextWriter) at umbraco.presentation.webservices.codeEditorSave.SaveXslt (String fileName, String oldName, String fileContents, Boolean ignoreDebugging)

1 Ответ

1 голос
/ 22 марта 2012

Эта ошибка часто встречается в Umbraco при разборе XSLT, так как анализатор предполагает, что некоторые из ваших данных могут быть нулевыми / пустыми, хотя в действительности они могут быть [всегда] назначены.

Хитрость заключается в том, чтобы найти строку кода виновника и заключить ее в тест на пустой блок if.

Например, это может быть или не быть этой строкой, хотя это довольно часто встречается с @id и NiceUrl():

<xsl:otherwise>
    <xsl:if test="@id != ''">
        <a href="{umbraco.library:NiceUrl(@id)}">
            <xsl:value-of select="@nodeName"/>
        </a>
    </xsl:if>
</xsl:otherwise>

Ошибка, вероятно, возникает из-за вызовов GetMedia() 1 или NiceUrl() 2 , так как они требуют передачи параметра типа Int32, но я вижу вас Вы уже вложили ваш GetMedia() вызов в блок if.

1 http://our.umbraco.org/forum/developers/xslt/30131-Loading-Xslt-Value-was-either-too-large-or-too-small-for-an-Int32-

2 http://our.umbraco.org/forum/developers/xslt/3102-Using-niceurl-Value-was-either-too-large-or-too-small-for-an-Int32-

...