2009-05-29 5 views
2

私は完全なXSL初心者です。アプリケーションによって作成された出力ログにCSV形式で表示されるさまざまなエラーメッセージをフォーマットするXSLファイルを作成しています。XSLルーキー - "if test"ブロック全体を繰り返さずに、 "this phrase"と "ths fraze"にマッチするXSLを作成できますか?

これらの出力ログの一致するタグには、わずかな差異が生じることがあります。たとえば、ログ内の1つの文に「Service Month/Year:」というフレーズが含まれている可能性がありますが、アプリケーションの別の領域から別の文には「Svc Month/Yr:」が含まれます。

私のXSLの1行に両方のバリエーションを入れる方法はありますか?またはIfブロック全体を繰り返す必要がありますか?それとも、Ifブロックで一致させるフレーズの各バリエーションを使用する必要がありますか?

私はここでバックティックに囲まれたXSLを投稿しようとしましたが、読むことが不可能な1つの大きな塊ですべて一緒に実行されます。誰かがこの質問を手伝うことができれば、私がそれを読めるようにする方法を教えてもらえれば嬉しいです。 :-)

ありがとうございます。

+2

質問や回答にコードを追加するには(コメントでは機能しません)、コードを入力して選択してCtrl-Kを押してください。それは4つのスペースでテキストを字下げします。 –

+0

ダニエルありがとう、コードを見ていなくても誰かが答えましたが、私は次回のことを知ります! –

答えて

3

XSLでは、他の言語のように条件文を組み合わせることができます。それぞれのif文は必要ありません。あなたはこれらの行に沿って何かを考えていましたか?

<xsl:choose> 
    <xsl:when test="contains(text(), 'Service Month/Year:') 
       or contains(text(), 'Svc Month/Yr:') 
       "> 
    <!-- do something --> 
    </xsl:when> 
</xsl:choose> 

xml/xslは大文字と小文字を区別します。それをより柔軟にするためには、さらに多くの冗長です:

<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/> 
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:choose> 
    <xsl:when test="contains(translate(text(), $upper, $lower), 'service month/year:') 
       or contains(translate(text(), $upper, $lower), 'svc month/yr:') 
       "> 
    <!-- do something --> 
    </xsl:when> 
</xsl:choose> 

EDIT:デリミタができ

<xsl:variable name="found"> 
    <xsl:call-template name="containsToken"> 
    <xsl:with-param name="inputString" select="text()"/> 
    <xsl:with-param name="tokens" select="'Service Month/Year:|Svc Month/Yr:'"/> 
    <xsl:with-param name="delimiter" select="'|'"/> 
    </xsl:call-template> 
</xsl:variable> 

<xsl:if test="$found = 'True'"> 
    <!-- process --> 
</xsl:if> 

:さらに良い答え私は

<xsl:template name="containsToken"> 
    <xsl:param name="inputString"/> 
    <xsl:param name="tokens"/> 
    <xsl:param name="delimiter"/> 
    <xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/> 
    <xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 

    <xsl:choose> 
    <xsl:when test="contains($tokens, $delimiter)"> 
     <xsl:variable name="token"> 
     <xsl:value-of select="substring-before($tokens, $delimiter)"/> 
     </xsl:variable> 
     <xsl:choose> 
     <xsl:when test="contains(translate($inputString, $upper, $lower), translate($token, $upper, $lower))"> 
      <xsl:text>True</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
      <!-- loop --> 
      <xsl:call-template name="containsToken"> 
      <xsl:with-param name="inputString" select="$inputString"/> 
      <xsl:with-param name="tokens" select="substring-after($tokens, $delimiter)"/> 
      <xsl:with-param name="delimiter" select="$delimiter"/> 
      </xsl:call-template> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:choose> 
     <xsl:when test="contains(translate($inputString, $upper, $lower), translate($tokens, $upper, $lower))"> 
      <xsl:text>True</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:text>False</xsl:text> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

使い方を手早くあなたが望むどんなキャラクターかチャプター。トークンは、それぞれの間の区切り文字で検索するもののリストです。楽しい!

+0

ありがとう、恐怖症。これは非常に役に立ちます。 –

+0

問題を解決した場合は、*答えとしてマークしてください。ありがとう。 – fearphage

関連する問題