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”,它也返回两个 NaN 结果。我怎样才能重写这个(a)更清洁和(b)以便它更好地工作。

我了解 ASP.NET Webforms,所以如果你能与之相比,它会有所帮助。

感谢帮助。

4

2 回答 2

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"/>

有关宏参数的更多信息,您可以阅读此文档

于 2009-11-06T10:56:32.170 回答
1

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

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

它应该只遍历具有可以除以的目标数量的那些。

不确定这是否是您所追求的,但我希望这会有所帮助。

于 2009-11-05T21:50:46.167 回答