需要XSLT和Umbraco的一点指导。相当新的XSLT,但我想我理解这些概念。在一个页面上,我有两列,每列都有自己独立的可选内容。这是通过标准内容选择器属性(每列一个)完成的。问题是我需要能够在页面上有两个不同的模板。所以本质上页面导航了两个列,其中列必须在其自己的页面中呈现其中的两个子项。
我使用通用XSLT处理了一个列,我发现它基本上只渲染它找到的子项,但我想让它呈现用户选择的任何一个。
我知道内容选择器返回页面的XML节点ID,并且可以与渲染模板功能一起使用以显示它(我有一个例子),但是当涉及添加我自己的属性然后将它们传递给RenderTemplate函数我迷路了。这个XSLT的新功能:)。
到目前为止,我有......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
<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>
任何人都知道为什么这不起作用以及如何做我想要的事情?上面给出的值是太大或太小的错误。
答案 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
复选框,但这会使调试实际错误的代码变得有点痛苦。
希望它有所帮助。