1

select 属性で自分の変数をチェックして、2 つのユーザー関数TestFxまたはのいずれかを呼び出す方法はありますかTestFx2xsl:ifまたはを使用できることがわかり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>て、巧妙なハックを探すよりも価値のあることに時間を費やしてください。(本当に必要な場合は、これを行うことができます。)

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 属性で自分の変数をチェックして、2 つのユーザー関数TestFxまたはのいずれかを呼び出す方法はありますかTestFx2xsl: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()

于 2013-04-12T02:56:42.890 に答える