1

I need to flip the elements of two nodes. Originally the variable were set with the following command:

    <xsl:variable name="matchesLeft" select="$questionObject/descendant::simpleMatchSet[position()=1]/simpleAssociableChoice"/>
    <xsl:variable name="matchesRight" select="$questionObject/descendant::simpleMatchSet[position()=2]/simpleAssociableChoice"/>

I now want to flip the variable with the following code:

    <xsl:variable name="matchesRight">
        <xsl:choose>
            <xsl:when test="$flippedQuestions='true'">
                <xsl:value-of select="$questionObject/descendant::simpleMatchSet[position()=2]/simpleAssociableChoice"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$questionObject/descendant::simpleMatchSet[position()=1]/simpleAssociableChoice"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

But it only get the value from the first element and not all elements in the node. How can I achive this?

4

2 回答 2

2

问题是 xsl:variable/@select 给了你一个节点集,但是 xsl:value-of 把一个节点集变成了它的字符串值。你想要节点集。在 XSLT 1.0 中,带有内容的 xsl:variable 将始终为您提供结果树片段;但在 select 属性中,您只能使用没有条件表达式的 XPath 1.0。

最好的解决方案当然是迁移到解决所有这些问题的 XSLT 2.0。坚持使用 1.0 的正当理由一直在减少。如果您确实必须使用 1.0,那么 XPath 1.0 中有一些复杂的变通方法,因为缺少条件表达式,例如 Dimitre 所示的那个。

于 2012-09-12T14:39:59.910 回答
0

使用

<xsl:variable name="matchesRight" select=
 "$questionObject/descendant::simpleMatchSet
                                  [1+($flippedQuestions='true')]
                                          /simpleAssociableChoice"/>

说明

在 XPath 中,每当将布尔值$someBVal传递给诸如 之类的数字运算符时+,都会使用 将布尔值转换为数字(0 或 1)number($someBVal)

根据定义:

number(false()) = 0

number(true()) = 1

因此

1+($flippedQuestions='true')

如果字符串的值不是字符串,则计算结果为 1,如果字符串的值是flippedQuestions字符串"true",则相同的表达式计算结果为 2 。flippedQuestions"true"

于 2012-09-12T12:04:42.920 回答