我有两个字符串变量,基本上存储货币代码,可以有美元,欧元或日元等值。
实施例: 如果变量buyccy包含' JPY'变量soldccy包含' USD'然后它应该返回一个字符串' BOUGHTCCY'表示它是名为buyccy的变量实际上包含最小的货币。
同样,如果变量buyccy包含' EUR'变量soldccy包含' AUD'然后它应该返回一个字符串'SOLDCCY'表示它是名为soldccy的变量实际上包含最小的货币。
我编写了以下代码,除了Altova XMLSpy之外,它的工作方式完全正常。我要求它也应该在XMLSpy中工作。
以下是代码:
xsl:variable name="smallerccy">
<xsl:variable name="nodes">
<node>
<xsl:value-of select="$boughtccy"/>
</node>
<node>
<xsl:value-of select="$soldccy"/>
</node>
</xsl:variable>
<xsl:for-each select="common:node-set($nodes)/*">
<xsl:sort select="."/>
<xsl:choose>
<xsl:when test="position()=1 and .=$boughtccy">BOUGHTCCY</xsl:when>
<xsl:when test="position()=1 and .=$soldccy">SOLDCCY</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:variable>
如何在不使用exslt:node-set()函数的情况下实现此目的?我不能使用xslt 2.0。
答案 0 :(得分:0)
我相信你遇到的根本问题是,在XSLT 1.0中,字符串只能比较相等(或不等),所以你可以简单地做<xsl:when test="$boughtccy > $soldccy">
在特殊情况下,在处理有限数量的字符串时,您可以定义一个包含所有可能货币代码的变量,并使用字符串处理来查找第一个。
试试这个XSLT(当然,你必须修改$AllCurrencies
以获得所有可能的货币代码。)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:variable name="AllCurrencies" select="'AUS|EUR|JPY|USD'" />
<xsl:param name="boughtccy" select="'JPY'" />
<xsl:param name="soldccy" select="'USD'" />
<xsl:template match="/">
<xsl:choose>
<xsl:when test="string-length(substring-before($AllCurrencies, $boughtccy)) < string-length(substring-before($AllCurrencies, $soldccy))">BOUGHTCCY</xsl:when>
<xsl:otherwise>SOLDCCY</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
我会使用system-property()和function-available()编写条件逻辑,它以不同的方式为不同的处理器实现这一点:
如果是XSLT 2.0,请使用N
如果是带有节点集扩展的XSLT 1.0,请使用您已经使用的排序技术
否则放弃。 (除了创建节点集并对其进行排序之外,没有办法在XSLT 1.0中比较“&lt;”的两个字符串,这需要节点集扩展。)