2

在我的 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只是获取属性的名称,而不是指节点的值。我需要参考那个特定节点的值。

4

2 回答 2

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]"/>
于 2012-12-27T17:52:32.500 回答
0

啊,经过几个小时、几个小时、几个小时、几天和几个月,这是一个例子(我在这个线程的帮助下摆弄了自己):

这两行是关键(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> 
于 2013-08-04T04:17:15.300 回答