select 属性で自分の変数をチェックして、2 つのユーザー関数TestFx
またはのいずれかを呼び出す方法はありますかTestFx2
。xsl:if
またはを使用できることがわかり
xsl:choose
ましたが、別の方法があるかどうか疑問に思っていました。
これを行う方法の完全なデモを次に示します。これは、XSLT 1.0 および 2.0 で高階関数を実装する方法の基本原則を示しています。これは、XSLT を使用した関数型プログラミングの FXSL ライブラリで使用されます。
<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
を に設定して上記のコードを変更するfalse()
と、結果は今回user:TestFx2()
が呼び出されたことを示します。
Text length is: 9
そして、約束どおり、変換には明示的な XSLT 条件命令(xsl:choose
またはxsl:if
) はありません。
また、 で不要なトリックを行う文字はカウントしませんsubstring()
。