2

私は完全な XSL 初心者であり、XSL ファイルを作成して、アプリケーションによって作成された出力ログに表示されるさまざまなエラー メッセージを CSV 形式にフォーマットします。

これらの出力ログでは、一致するタグにわずかな違いが生じる場合があります。たとえば、ログ内の 1 つの文には「サービス月/年:」というフレーズが含まれている場合がありますが、アプリケーションの別の領域からの別の文には、代わりに「サービス月/年:」が含まれています。

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

XSL をバッククォートで囲んでここに投稿しようとしましたが、すべてが 1 つの大きな塊で実行され、読み取ることができません。誰かがこの質問を手伝ってくれるなら、読みやすくする方法を教えてくれたら喜んで投稿します。:-)

ありがとうございました。

4

1 に答える 1

3

XSL では、他の言語と同様に条件文を組み合わせることができます。それぞれがその on 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>

編集:そして、私が思いついたさらに良い答え

<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>

使用法:

<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>

区切り文字は、任意の文字または文字にすることができます。Tokens は、それぞれを区切り文字で区切って検索するリストです。楽しみ!

于 2009-05-29T17:41:22.173 に答える