1

有没有办法可以在 select 属性中检查我的变量并调用两个用户函数之一TestFxTestFx2. 现在我知道我可以使用xsl:ifor xsl:choose,但只是想知道是否还有其他方法。

例如select="$hasTextArea=true ? TestFx : TestFx2"

<xsl:variable name="hasTextArea">true</xsl:variable>

<xsl:template name="break">
    <xsl:param name="text" select="."/>
    <xsl:value-of disable-output-escaping="yes" select="user:TestFx($text)" />
</xsl:template>
4

2 回答 2

1

XSLT 1.0 没有三元运算符。只需使用<xsl:if>or<xsl:choose>并将您的时间花在比试图找到一个聪明的 hack 更有价值的事情上。(如果你真的必须这样做,你可以这样做。

XSLT 2.0(即 XPath 2.0)有这个:

<xsl:value-of select="
  if ($hasTextArea = 'true') 
    then user:TestFx($text) 
    else user:TestFx2($text)
" />
于 2013-04-11T21:04:18.903 回答
0

有没有办法可以在 select 属性中检查我的变量并调用两个用户函数之一TestFxTestFx2. 现在我知道我可以使用 xsl:ifor xsl:choose,但只是想知道是否还有其他方法。

这是一个完整的演示如何做到这一点。这说明了如何在 XSLT 1.0 和 2.0 中实现高阶函数的基本原理——在FXSL 库中用于使用 XSLT 进行函数式编程

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="my:user" xmlns:my="my:my">
 <xsl:output method="text"/>

 <my:functions>
   <my:F1/>
   <my:F2/>
 </my:functions>

 <xsl:variable name="vMyFuncs" select="document('')/*/my:functions/*"/>

 <xsl:param name="phasTextArea" select="true()"/>
 <xsl:param name="pText" select="'Some Text'"/>

 <xsl:template match="/*">
    <xsl:variable name="vFunc" select=
      "$vMyFuncs[1][$phasTextArea] | $vMyFuncs[2][not($phasTextArea)]"/>

  <xsl:apply-templates select="$vFunc"/>
 </xsl:template>

 <xsl:template match="my:F1">
  <xsl:value-of select="user:TestFx($pText)"/>
 </xsl:template>

 <xsl:template match="my:F2">
  <xsl:value-of select="user:TestFx2($pText)"/>
 </xsl:template>

 <msxsl:script language = "c#"  implements-prefix = "user">
  public string TestFx(string text)
  {
    return "Text is: " + "'" +text + "'";
  }

  public string TestFx2(string text)
  {
    return string.Format("Text length is: {0}", text.Length);
  }
</msxsl:script>
</xsl:stylesheet>

当将此转换应用于任何 XML 文档(未使用)时,将产生所需的正确结果(user:TestFx()称为)

Text is: 'Some Text'

如果我们通过设置$phasTextAreato 来修改上面的代码false(),结果现在显示这个时间user:TestFx2()已经被调用了

Text length is: 9

而且,正如所承诺的,转换没有明确的 XSLT 条件指令xsl:choosexsl:if)。

此外,我们不计算字符来使用substring().

于 2013-04-12T02:56:42.890 回答