2013-04-11 141 views
1

有没有一种方法可以检查我的变量在选择属性和调用两个用户功能TestFxTestFx2之一。现在我知道我可以使用xsl:ifxsl:choose,但只是想知道是否有另一种方式。检查XSLT:在XSLT变量:选择

例如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> 
+0

Rod,是的,有这样的一种方式,毕竟它并不那么困难或棘手。 – 2013-04-12 02:57:41

回答

1

XSLT 1.0不具有三元运算符。只需使用<xsl:if><xsl:choose>并花费你的时间在一些更有价值的事情上,而不是试图找到一个聪明的黑客。 (你可以做this,如果你真的必须。)

XSLT 2.0(即XPath 2.0中)有这样的:

<xsl:value-of select=" 
    if ($hasTextArea = 'true') 
    then user:TestFx($text) 
    else user:TestFx2($text) 
" /> 
0

有没有一种方法可以检查我的变量在选择属性和 请拨打两个用户功能TestFxTestFx2中的一个。现在我知道我可以使用 xsl:ifxsl:choose,但只是想知道是否有另一种方式。

这里是一个完整的演示如何做到这一点。这说明了如何在XSLT 1.0和2.0中实现高阶函数的基本原理 - 在FXSL library for functional programming with 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' 

如果我们通过设置修改上面的代码$phasTextAreafalse(),结果现在显示此时user:TestFx2()已被称为

Text length is: 9 

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

此外,我们不计算字符做substring()不必要的窍门。