如何从父文档访问属性以在子项中使用

时间:2009-11-05 21:34:23

标签: xml xslt xpath umbraco

我是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,所以如果你可以比较它的帮助。

感谢帮助。

2 个答案:

答案 0 :(得分: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 :(得分:1)

我只熟悉XSLT,所以从这个角度来看,我建议为你的for-each select语句添加一个资格。我还没有看到XML,但有类似的东西:

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

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

不确定这是不是你想要的,但我希望这有帮助。