如何将当前匹配的xsl节点的值转换为变量?

时间:2012-12-27 17:37:07

标签: sharepoint xslt

在我的xsl中,我想在几个节点上match,然后将匹配节点的值抓取到变量中。我怎么能这样做?

我需要在下面的Budget0放置一个通配符变量:

<xsl:template match="FieldRef[@Name='Budget0' or @Name='Scope' or @Name='Risk' or @Name='Schedule']" mode="body">
    <xsl:param name="thisNode" select="."/>
    <xsl:variable name="currentValue" select="$thisNode/Budget0" />
    <xsl:variable name="statusRating1">(1)</xsl:variable>
    <xsl:variable name="statusRating2">(2)</xsl:variable>
    <xsl:variable name="statusRating3">(3)</xsl:variable>

    <xsl:choose>
        <xsl:when test="contains($currentValue, $statusRating1)">
            <span class="statusRatingX statusRating1"></span>
        </xsl:when>
        <xsl:when test="contains($currentValue, $statusRating2)">
            <span class="statusRatingX statusRating2"></span>
        </xsl:when> 
        <xsl:when test="contains($currentValue, $statusRating3)">
            <span class="statusRatingX statusRating3"></span>
        </xsl:when> 
        <xsl:otherwise>
            <span class="statusRatingN"><xsl:value-of select="$currentValue" /></span>
        </xsl:otherwise>                    
    </xsl:choose>
</xsl:template> 

在此代码段中,xsl:template match...工作得很好;它确实似乎匹配这些领域。我可以在Firebug中看到那些字段就像它们应该的那样接收statusRating1 css类(因为它们都设置为接收Budget0字段的值。

[更新]

我发现如果我将它用于变量:

<xsl:variable name="currentValue" select="current()/@Name" />

<xsl:variable name="currentValue" select="FieldRef[@Name=current()/@Name"] />

它将被otherwise标记捕获,并将打印字段的名称。换句话说,html打印

<span class="statusRatingN">Budget0</span>

如果我尝试任何Dimitre的解决方案(如下),它在任何when子句中都不会匹配,并且html会像这样输出(注意span的文本是空白的):

<span class="statusRatingN"></span>

因此,我推断$currentValue只获取属性的名称,而不是指节点的值。我需要引用该特定节点的值。

2 个答案:

答案 0 :(得分:1)

使用

<xsl:variable name="currentValue" select="$thisNode/*[name()=current()/@Name]"/>

或者

<xsl:variable name="currentValue" select="$thisNode/*[name()=$thisNode/@Name]"/>

或者,(最佳)

<xsl:variable name="currentValue" select="*[name()=current()/@Name]"/>

答案 1 :(得分:0)

啊,经过几小时,几小时,几小时,几天和几个月,这是一个例子(我自己摆弄with help from this thread):

这两行是关键(Dimitre的答案很接近):

<xsl:param name="thisNode" select="."/>
<xsl:variable name="currentValue" select="$thisNode/@*[name()=current()/@Name]" />

这是整个函数,它读取两个不同的列并将值应用于其中一个:

<xsl:template match="FieldRef[@Name='YesNo1']|FieldRef[@Name='YesNo2']" mode="body">
    <xsl:param name="thisNode" select="."/>

    <xsl:variable name="currentValue" select="$thisNode/@*[name()=current()/@Name]" />
    <xsl:variable name="yesvalue">Yes</xsl:variable>
    <xsl:variable name="novalue">No</xsl:variable>

    <xsl:choose>
        <xsl:when test="contains($currentValue, $yesvalue)">
            <span class="yesno yes"><xsl:value-of select="$currentValue" /></span>
        </xsl:when>
        <xsl:when test="contains($currentValue, $novalue)">
            <span class="yesno no"><xsl:value-of select="$currentValue" /></span>
        </xsl:when>
    <xsl:otherwise>
            <span class="yesnoN"><xsl:value-of select="$currentValue" /></span>
        </xsl:otherwise>
    </xsl:choose>

</xsl:template>