有没有办法可以在 select 属性中检查我的变量并调用两个用户函数之一TestFx
或TestFx2
. 现在我知道我可以使用
xsl:if
or 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'
如果我们通过设置$phasTextArea
to 来修改上面的代码false()
,结果现在显示这个时间user:TestFx2()
已经被调用了:
Text length is: 9
而且,正如所承诺的,转换没有明确的 XSLT 条件指令(xsl:choose
或xsl:if
)。
此外,我们不计算字符来使用substring()
.