12

xml ファイルを多くのテーブルを含む html ファイルに変換する xslt コードを書きました。列の 1 つにはメッセージ (非常に長いメッセージ) が含まれていますが、その行は「検証に合格しました」または「検証に失敗しました」という 2 つの単語のいずれかで始まります。 "

私の要件は、検証が失敗した場合は表の行全体を赤にし、検証に合格した場合は表の行全体を緑にすることです

 <xsl:choose>
  <xsl:when test="contains(@message,'Verification failed:')"><td bgcolor="#FF0000">   <xsl:value-of select="@Message"/></td></xsl:when>
  <xsl:when test="contains(@message,'Verification passed:')"><td bgcolor="#00FF00"><xsl:value-of select="@Message"/></td></xsl:when>   
  <xsl:otherwise><td> <xsl:value-of select="@Message"/></td></xsl:otherwise>
</xsl:choose> 
4

4 に答える 4

22

残念ながら、「trim()」関数に期待することを言っていません。しかし、要件の説明から、normalize-space() は十分に近いと思います。

starts-with(normalize-space(message), 'Verification passed'))

XPath の normalize-space() 関数は、(a) 空白文字の内部シーケンスを 1 つのスペースに置き換え、(b) 空白の定義がわずかに異なるという点で、Java の trim() メソッドとは異なります。

于 2012-09-17T14:31:54.937 に答える
4

xslt でトリムなどの操作はありますか?

I. XSLT 1.0

いいえ、XSLT 1.0 で「トリム」を実行するのはかなり困難です。

FXSLtrim関数/テンプレートは次のとおりです。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:import href="trim.xsl"/>

  <!-- to be applied on trim.xml -->

  <xsl:output method="text"/>
  <xsl:template match="/">
    '<xsl:call-template name="trim">
        <xsl:with-param name="pStr" select="string(/*)"/>
    </xsl:call-template>'
  </xsl:template>
</xsl:stylesheet>

この XML ドキュメントでこの変換が実行されると(完全なインポート ツリーを構成する他のスタイルシート モジュールを少なくともいくつかダウンロードする必要があります) :

<someText>

   This is    some text   

</someText>

必要な正しい結果が生成されます。

'This is    some text'

II XSLT 2.0 / XPath 2.0

まだ少しトリッキーですが、非常に短いです:

     if (string(.))
       then replace(., '^\s*(.+?)\s*$', '$1')
       else ()

対応する完全な変換は次のとおりです。

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     "<xsl:sequence select=
         "if (string(.))
           then replace(., '^\s*(.+?)\s*$', '$1')
           else ()
           "/>"
 </xsl:template>
</xsl:stylesheet>

同じ XML ドキュメント (上記) に適用すると、同じ正しい結果が生成されます。

"This is    some text"
于 2012-09-17T12:04:25.113 に答える
0

registerLangFunctions で XSLT1 を使用する

(複雑な) XSLT2 標準がリリースされてから約 10 年後の今日、多くのプロジェクトがまだ (より高速な) XSLT1を使用しています。おそらく問題は「単純か複雑か」だけではなく、 XSLT1は Perl、PHP、Python、PostgreSQL、および他の多くのコミュニティにとって事実です。

したがって、Perl、PHP、および Python のソリューション: メイン言語を使用して、trimXSLT1 に存在しない別の通常の機能を実行します。

PHP の例: https://en.wikibooks.org/wiki/PHP_Programming/XSL/registerPHPFunctions

于 2014-05-24T20:35:20.797 に答える
-16
 <xsl:variable name="Colour">
 <xsl:choose>
 <xsl:when test="contains(@Message,'Verification failed:')">background-color:red;       </xsl:when>
 <xsl:when test="contains(@Message,'Verification passed:')">background-color:green</xsl:when>
 <xsl:otherwise> </xsl:otherwise>
 </xsl:choose>
 </xsl:variable>

 <tr style="{$Colour}">
 <td> <xsl:value-of select="@Time"/></td>
 <td>Line <xsl:value-of select="@Line"/></td>
 <td> <xsl:value-of select="@Type"/></td>
 <td> <xsl:value-of select="@Message"/></td>
 </tr>
于 2012-09-19T11:15:26.193 に答える