2009-11-05 45 views
3

我是Umbraco CMS的新手。请帮忙。如何从父文档访问属性以在儿童中使用

我有一个Umbraco网站,我在其中创建了一个名为'Master'的DocumentType。 '主'页面允许用户输入他们正在进行的募集资金的目标和金额。在“主”页面上,我有一个宏,它会自动执行数学运算以生成将在整个网站中使用的百分比。宏调用以下XSLT

<xsl:for-each select="$currentPage/ancestor-or-self::*"> 
    <xsl:variable name="amount" select="* [@alias = 'FundraisingCurrentAmount']"/> 
    <xsl:variable name="goal" select="* [@alias = 'FundraisingGoal']"/> 
    <xsl:variable name="percentage" select="$amount div $goal * 100"/> 
    <xsl:value-of select="$percentage"/> 
</xsl:for-each> 

这工作,但,我假设,因为它是一个“的for-each”它也返回2 NaN的结果。我怎样才能改写这个(a)清洁剂和(b)使它更好地工作。

我明白ASP.NET Webforms,所以如果你能比较它会帮助。

欣赏帮助。

回答

4

在Umbraco中,您可以拥有所谓的递归值。这基本上是查找节点层次结构直到它填充值的页面值。

这些也可以传递给宏。

所以你的情况假设您的宏被称为“charityTotaliser”你可以使用下面的宏调用:

<umbraco:macro alias="charityTotaliser" ammount="[$FundraisingCurrentAmount]" goal="[$FundraisingGoal]"runat="server"/> 

的$表示该值是递归的。

的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.ExsltMath="urn:Exslt.ExsltMath" 
    exclude-result-prefixes="msxml umbraco.library Exslt.ExsltMath"> 

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

    <xsl:param name="currentPage"/> 

    <!-- Macro parameters --> 
    <xsl:variable name="FundraisingCurrentAmount" select="/macro/FundraisingCurrentAmount"/> 
    <xsl:variable name="FundraisingGoal" select="/macro/FundraisingGoal"/> 

    <xsl:template match="/"> 

     <xsl:value-of select="$FundraisingCurrentAmount div $FundraisingGoal * 100"/> 

    </xsl:template> 

</xsl:stylesheet> 

如果科目编号,您还可以指定要传递回退值(如果递归值无法找到):

<umbraco:macro alias="charityTotaliser" ammount="[$FundraisingCurrentAmount], [#FallBackAmmount], 1234" goal="[$FundraisingGoal]"runat="server"/> 

有关宏观参数的更多信息,你可以看到这篇documentation

1

我只熟悉XSLT,所以从这个角度来说,我建议为您的for-each select语句添加一个限定条件。我还没有看到XML,但类似:

<xsl:for-each select="$currentPage/ancestor-or-self::*[FundraisingGoal>0]"> 
. 
. 
. 
</xsl:for-each> 

它应该只通过那些目标数量可以除以。

不知道这是你以后,但我希望这有助于。

+0

我知道这不是*严格要求*在这种情况下,但我会选择使用'>'代替'>',不仅因为后者打破了堆栈溢出语法突出显示器。 – Tomalak

+0

同意。我通常首先输入它>代替>,然后想知道为什么XSLT无效。 :) – dredful