我正在更改一些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相对较新,所以我认为我很想念它。
谢谢, 詹姆斯
答案 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中变得更加容易。