如何在不使用扩展函数的情况下在包含两个字符串的结果树片段(RTF)中找到最小字符串xslt 1.0

时间:2017-10-09 12:43:23

标签: xslt

我有两个字符串变量,基本上存储货币代码,可以有美元,欧元或日元等值。

实施例: 如果变量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。

2 个答案:

答案 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)) &lt; 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;”的两个字符串,这需要节点集扩展。)