2012-03-22 2 views
2
<?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-файле. Я получаю эту ошибку.Ссылка на PDF из меню

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

System.OverflowException: Значение было либо слишком велик или слишком мал для Int32. в System.Convert.ToInt32 (двойное значение) в System.Convert.ChangeType (значение объекта, тип conversionType, поставщик IFormatProvider) в System.Xml.Xsl.Runtime.XmlQueryRuntime.ChangeTypeXsltArgument (XmlQueryType XmlType, значение объекта, тип DestinationType) на System.Xml.Xsl.Runtime.XmlQueryContext.InvokeXsltLateBoundFunction (имя String, String NamespaceURI, IList`1 [] арг) в (XmlQueryRuntime {урновых: схемы-Microsoft-ком: XSLT-отладки} выполнения) в корне (XmlQueryRuntime {urn: schemas-microsoft-com: xslt-debug}) в System.Xml.Xsl.XmlILCommand.Execute (Object defaultDocument, XmlResolver dataSources, XsltArgumentList аргументList, писатель XmlWriter) в System.Xml.Xsl.XslCompiledTransform .Transform (IXPathNavigable input, XsltArgumentList argumen ц, результаты TextWriter) в umbraco.presentation.webservices.codeEditorSave.SaveXslt (String FileName, Струнный Старое_имя, Струнные fileContents, Boolean ignoreDebugging)

+0

вы знаете точную линию/блок, который бросает ошибку делать? –

ответ

1

Эта ошибка часто встречается в 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() или NiceUrl() так как им требуется передать параметр типа Int32, но я вижу, что вы уже вложили свой вызов GetMedia() в if-блок.

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

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

+0

В случае, когда вы перебираете узлы страницы, @id никогда не пуст, потому что все объекты INode должны иметь атрибут id. – Digbyswift

+0

@ Digbyswift - Вы даже прочитали мой ответ? Вы понимаете, что я использовал эту строку кода как пример, чтобы доказать еще один момент? Иногда вам нужно заключить линию ошибок внутри блока IF, чтобы заставить ее работать. Я даже сказал, что это не может быть эта конкретная строка кода. Вы правы в том, что все узлы _page_ должны содержать атрибут ID, но парсер не предполагает этого, он делает предположения на основе _actual_ XML, где не все _actual_ узлы имеют ID (например, свойства Umbraco). Попробуйте выполнить XSLT на этом [PasteBin] (http://pastebin.com/Tyw0Zust), чтобы точно увидеть, что я имею в виду. –

+0

Да, я сделал, и вы должны быть более ясными в своем ответе. Используя @id и NiceUrl() в качестве примеров в помеченной тегом Umbraco, вы создаете путаницу для последующих пользователей. – Digbyswift

Смежные вопросы