ティムロビンソンが指摘するように、translate
はこのトリックを行います。 (私はそれを「ハック」とは呼んでいませんが、XSLTとの関係の長い間、私の悩みの段階にいます。)このようなものを使用すると、あなたのコードはもっと読みやすくなります:私は私が書く最も変換の先頭に含まglobals.xslt
ファイルの一部である
<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/>
<xsl:variable name="ws" value=" 	"/>
...。次に、これは:
<xsl:value-of select="translate(x, concat($uc, $ws), $lc)"/>
それぞれの大文字を同等の小文字に変換し、各空白文字を無制限に変換します。
通常、xsl:variable
を使用する理由は、(上の例のように)コードを読みやすくしたり、効果的に計算できない中間結果を保存したりするためです。出力にデータを取り込む第4の方法は、あなたが言及していないものです。それはかなり価値があります。属性値テンプレートです。これらのすべてが、同じことを実行します。この特定のケースでは
<link>
<xsl:attribute name="name">
<xsl:value-of select="translate(name, concat($uc, $ws), $lc)"/>
</xsl:attribute>
</link>
<link>
<xsl:attribute name="name" value="translate(name, concat($uc, $ws), $lc)"/>
</link>
<xsl:variable name="linkName" value="translate(name, concat($uc, $ws), $lc)"/>
<link name="{$linkName}"/>
を、それが単純かつ明確である最後の二つのどの議論の余地です。たいていの場合、値の計算を出力に挿入する方法から分離することで、同じことをするより冗長なXSLT構造ではなく、AVTを使用する場合と同様に、両方を理解しやすくなります。
normalize-space()は、文字列の途中に重複する空白文字(スペース、タブ、キャリッジリターン)を削除し、それらを単一のスペースに変換します。 –