2009-12-05 12 views
7

私は、XSLとXpath関数を使用して、nameという名前のXML属性からすべての空白を削除し、小文字にします。現時点で私は何かを持っています空白を削除するXpath関数

<xsl:variable name="linkName"> 
<xsl:value-of select="normalize-space(name)"/> 
</xsl:variable> 

これは、最初と最後に空白を削除します。助言がありますか?

取り扱い、あなたがHTML

または

<xsl:attribute name="y"> 
<xsl:value-of select="x"/> 

に直接配置

<xsl:value-of select="x"/> 

を使用するか、または

を使用することができるようだとしてXMLデータを変更するためのベストプラクティスは何ですか
<xsl:variable name="x"> 

私は違いがあるかどうか、それぞれを使うべきかどうかは分かりません。どんな助けでも大歓迎です。

アリー

+1

normalize-space()は、文字列の途中に重複する空白文字(スペース、タブ、キャリッジリターン)を削除し、それらを単一のスペースに変換します。 –

答えて

6

ティムロビンソンが指摘するように、translateはこのトリックを行います。 (私はそれを「ハック」とは呼んでいませんが、XSLTとの関係の長い間、私の悩みの段階にいます。)このようなものを使用すると、あなたのコードはもっと読みやすくなります:私は私が書く最も変換の先頭に含まglobals.xsltファイルの一部である

<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/> 
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/> 
<xsl:variable name="ws" value=" &#13;&#10;&#09"/> 

...。次に、これは:

<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を使用する場合と同様に、両方を理解しやすくなります。

3

これは、最初と最後ではなく、途中でホワイトスペースを削除します。助言がありますか?

translate(' &#13;&#10;', '')を使用して、スペース、改行、改行文字を削除できます。 .NETクラスまたはMSXSLを使用して変換を行う場合は、文字を小文字にするのは少し難しいです。私が使った1つのハックは、大文字を小文字に変換するのにtransformを使うことです。もう1つは、lower-case機能を提供する.NET拡張オブジェクトを作成することです。 lower-case関数はXPath/XSL 2.0に組み込まれています。 HTMLで直接

  • <xsl:value-of ...場所値
  • <xsl:attribute ...は、現在のHTML要素の属性を作成し、値
  • を割り当てます。

    あなたの質問の後半部分では、彼らは別のことを行います

  • <xsl:variable ...は、HTMLに影響を与えずにXSL変数を宣言します。 <xsl:value-of select="$x"/>を使用して、この変数をHTMLに書き込むことができます。
関連する問題