2012-03-22 90 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 ) at System.Xml.Xsl.Runtime.XmlQueryContext.InvokeXsltLateBoundFunction(String name,String namespaceUri,IList`1 [] args) at(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug} runtime) at Root (XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug} runtime) at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument,XmlResolver dataSources,XsltArgumentList argumentList,XmlWriter writer) at System.Xml.Xsl.XslCompiledTransform .Transform(IXPathNavigable输入,XsltArgumentList argumentsmen TS,TextWriter的结果) 在umbraco.presentation.webservices.codeEditorSave.SaveXslt(字符串文件名,字符串使用oldName,字符串fileContents,布尔ignoreDebugging)

+0

你知道确切的行/块抛出的错误? – 2012-03-22 15:43:42

回答

1

这个错误在XSLT解析常见于一把umbraco的解析器假定一些你数据可能为空/空,实际上可能会[总是]分配。

诀窍是找到罪魁祸首的代码行,并附上一个测试空白如果块。

例如,它可以是或可以不是这条线,尽管其相当通常与@idNiceUrl()发生:

<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 2012-03-22 17:58:46

+0

@Digbyswift - 你甚至读过我的回答吗?你知道我用这行代码作为_example_来证明另一点吗?有时你需要把错误行放在IF块中以使其工作。我甚至说它可能不是这个特定的代码行。你说得对,因为所有_page_节点都必须包含一个ID属性,但解析器不会假设这一点,它会根据_actual_ XML进行假设,而不是所有_actual_节点都有一个ID(例如Umbraco属性)。尝试在此[PasteBin](http://pastebin.com/Tyw0Zust)上执行XSLT以查看我的意思。 – 2012-03-23 01:39:48

+0

是的,我做了,你的答案应该更清楚。通过在Umbraco标记的帖子中使用@id和NiceUrl()作为示例,您将为后续用户造成混淆。 – Digbyswift 2012-03-23 09:23:26