XSLT“选择时间”设置变量会产生不同的结果

时间:2019-02-13 15:58:09

标签: xml xslt xslt-1.0

我正在更改一些XSLT,并尝试使用select-when有条件地设置变量。以前,该变量是完全无条件设置的。我不知道为什么。

以前是通过以下方式设置的:

            <xsl:variable name="fields" select="pubs:field[@name=normalize-space($elements)]" />

我尝试使用以下方法设置$ fields:

            <xsl:variable name="fields">
            <xsl:choose>
                <xsl:when test="contains($elements, 'acceptance-date')">
                    <xsl:value-of select="pubs:field[@name=normalize-space($elements)]" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="pubs:field[@name=normalize-space($elements)]" />
                </xsl:otherwise>
            </xsl:choose>
            </xsl:variable>

我希望我的其余代码能够像以前一样继续进行,现在我在实验时就已经将其设置为这种方式(select语句相同)。相反,当在其他地方使用$ fields变量时,我收到“ XPATH错误:类型无效”的信息:

            <xsl:variable name="field_values" select="$fields/pubs:people/*|$fields/pubs:keywords/*|$fields/pubs:items/*|$fields/*[local-name()!='items' and local-name()!='keywords' and local-name()!='people']" />

我对XSLT / XPATH相对较新,所以我认为我很想念它。

谢谢, 詹姆斯

2 个答案:

答案 0 :(得分:0)

您使用什么XSLT引擎?如果是MS-XSL,则可以尝试使用node-set()函数,例如

            <xsl:variable name="fields">
            <xsl:choose>
                <xsl:when test="contains($elements, 'acceptance-date')">
                    <xsl:copy-of select="pubs:field[@name=normalize-space($elements)]" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="pubs:field[@name=normalize-space($elements)]" />
                </xsl:otherwise>
            </xsl:choose>
            </xsl:variable>

    <xsl:variable name="field_values" select="msxsl:node-set($fields)/pubs:field/pubs:people/*|msxsl:node-set($fields)/pubs:field/pubs:keywords/*|msxsl:node-set($fields)/pubs:field/pubs:items/*|msxsl:node-set($fields)/pubs:field/*[local-name()!='items' and local-name()!='keywords' and local-name()!='people']" />

还将名称空间声明添加到XSLT的根元素:

xmlns:msxsl="urn:schemas-microsoft-com:xslt"

答案 1 :(得分:0)

您的示例显然不是真实的,因为条件的两个分支是相同的。但在许多情况下,您可以这样做:

<xsl:variable name="x" 
 select="$nodes[contains($elements, 'acceptance-date')] 
       | $other-nodes[not(contains($elements, 'acceptance-date'))]"/>

考虑是否真的要使用XSLT 1.0。这样的问题在XSLT 2.0或3.0中变得更加容易。