Umbraco XSLT渲染模板Word

时间:2012-02-07 11:00:10

标签: macros umbraco

需要XSLT和Umbraco的一点指导。相当新的XSLT,但我想我理解这些概念。在一个页面上,我有两列,每列都有自己独立的可选内容。这是通过标准内容选择器属性(每列一个)完成的。问题是我需要能够在页面上有两个不同的模板。所以本质上页面导航了两个列,其中列必须在其自己的页面中呈现其中的两个子项。

我使用通用XSLT处理了一个列,我发现它基本上只渲染它找到的子项,但我想让它呈现用户选择的任何一个。

我知道内容选择器返回页面的XML节点ID,并且可以与渲染模板功能一起使用以显示它(我有一个例子),但是当涉及添加我自己的属性然后将它们传递给RenderTemplate函数我迷路了。这个XSLT的新功能:)。

到目前为止,我有......

<?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">
   <xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<xsl:variable name="nodeID" select="data[@alias='leftColumn']"/>
<xsl:template match="/">
      <xsl:value-of select="umbraco.library:RenderTemplate($nodeID)" disable-output-escaping="yes"/>
</xsl:template>

</xsl:stylesheet>

任何人都知道为什么这不起作用以及如何做我想要的事情?上面给出的值是太大或太小的错误。

1 个答案:

答案 0 :(得分:1)

你实际上有两个问题......

调用RenderTemplate()

使用替代模板时,

RenderTemplate实际上需要两个参数,第一个是内容节点ID,第二个是您想要应用的所选模板。

<xsl:value-of 
    select="umbraco.library:RenderTemplate($nodeID, $templateID)" 
    disable-output-escaping="yes" />

有关详细信息,请参阅以下链接:http://our.umbraco.org/wiki/reference/umbracolibrary/rendertemplate

错误太大或太小

通过在相关代码周围放置一个if-empty语句,可以很容易地解决这个问题。

<xsl:if test="$nodeID != ''">
    <xsl:value-of 
        select="umbraco.library:RenderTemplate($nodeID, $templateID)" 
        disable-output-escaping="yes" />
</xsl:if>

XSLT解析器喜欢假定某些值为null,而实际上它们不是。另一种方法是在保存时检查Skip Errors复选框,但这会使调试实际错误的代码变得有点痛苦。

希望它有所帮助。