0

func:function我试图通过使用 EXSLT 的元素来实现一个“三元运算符”扩展函数,以便在我的样式表中使用。出于兼容性原因,我必须使用 XSLT 1.0。我想出了这个:

<func:function name="myext:ternary">
  <xsl:param name="expr" />
  <xsl:param name="ifTrue" />
  <xsl:param name="ifFalse" />

  <func:result>
    <xsl:choose>
      <xsl:when test="boolean($expr)"><xsl:value-of select="$ifTrue"/></xsl:when>
      <xsl:otherwise><xsl:value-of select="$ifFalse" /></xsl:otherwise>
    </xsl:choose>
  </func:result>
</func:function>

无论我在哪里使用它都可以正常工作。但是,我也尝试实现一个 substring-after-last 函数(从这里开始)。此代码工作正常:

<func:function name="myext:substring-after-last">
  <xsl:param name="string" select="''"/>
  <xsl:param name="delimiter" select="$d" />

  <func:result>
    <xsl:choose>
      <xsl:when test="contains($string, $delimiter)">
        <xsl:value-of select="myext:substring-after-last(substring-after($string, $delimiter), $delimiter)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$string"/>
      </xsl:otherwise>
    </xsl:choose>
  </func:result>
</func:function>

这样它也可以工作:

[…]
  <func:result>
    <xsl:if test="not(contains($string, $delimiter))">
      <xsl:value-of select="$string"/>
    </xsl:if>
    <xsl:if test="not($string='')">
      <xsl:value-of select="myext:substring-after-last(substring-after($string, $delimiter), $delimiter)"/>
    </xsl:if>
  </func:result>
</func:function>

…但是当我尝试使用“三元”函数的实现时,它不起作用;

这不起作用:

<func:result>
  <xsl:value-of select="myext:ternary(
    contains($string, $delimiter) and not($string = ''),
    myext:substring-after-last(substring-after($string, $delimiter), $delimiter),
    $string
  )"/>
</func:result>

此方法导致我的样式表向我抛出此错误

Error at xsl:apply-templates on line 49 of file:/[my_main_file].xsl:
  Too many nested apply-templates calls
Transformation failed: Run-time errors were reported

我试图通过使用 -Xss16m 开关来增加 Java 的堆栈大小,但这只会导致 Saxon 抛出 OutOfMemoryError(Java 堆空间)。我发送给这个函数的数据集相当小,所以我不明白溢出发生在哪里以及为什么我甚至有必要尝试增加堆栈大小。

我究竟做错了什么?

4

1 回答 1

0

我试图实现一个“三元运算符”扩展功能

使用位置谓词与否定谓词变量检查的并集作为 else 语句:

//var[1] | //var[not //var]

将互斥表达式的串联用作三元成语:

concat("(",substring(translate(., "()-", ""), 1, 3), ")", substring(translate(., "()-", ""), 4, 3), "-", substring(translate(., "()-", ""), 7, 4)))

在 XPath 中 number(true()) 为 1,而 number(false()) 为 0,当 substring() 函数的第二个参数大于字符串的实际长度时,返回空字符串。因此 substring($s1, number(not($condition))*string-length($s1)+1) 如果 $condition 为真则返回 $s1,否则返回空字符串。以互斥方式连接两个这样的表达式为我们提供了条件字符串表达式。

参考

于 2015-12-02T05:44:27.263 回答