0

xsltでコードを書くのは初めてです。xsl コードで xml ファイル内のすべてのノード/属性を調べて、'__(string)' を検索し、'result=success/failed' をカウントするようにします。このサイトでスレッドを見つけて少し助けてもらいました: How do you do wildcard matching with XSLT?
文字列の一致を見つけるための xsl コードを取得しました。しかし、私の問題は、指定された文字列一致の成功と失敗をカウントするコードの書き方がわからないことです。出力が次のようになることを望みます。

     **(Casename)**  |  **(total success)** | **(total failed)**
     __(stringmatch1)|         2            |        0
     __(stringmatch2)|         0            |        2

xml ファイルのサンプルを次に示します。

<report>
     <programtest user="testuser">
           <programtest software="test">
               <programtest testname="SW log">
               </programtest>
               <programtest testname="HW log">
               </programtest>
               <programtest testname="loop_program_test">
                  <programtest casename="test" iteration="1" result="success">
                     <programtest casename="__temp1" type="specifictestcase" result="success" >
                      </programtest>
                      <programtest casename="__temp2" type="specifictestcase" result="failed" >
                      </programtest>
                  </programtest>
                  <programtest casename="test" iteration="2" result="success">
                      <programtest casename="__temp1" type="specifictestcase" result="success" >
                      </programtest>
                      <programtest casename="__temp2" type="specifictestcase" result="failed" >
                      </programtest>
                  </programtest>
               </programtest>
           </programtest>
     </programtest>
</report>

どんな助けでも大歓迎です!:-)

4

2 に答える 2

1

これはグループ分けの問題だと思います。特定のprogramtest要素ごとに @casename 属性で結果をグループ化する必要があります。XSLT2.0 では、 xsl:for-each-group要素を使用してこれを行います。

<xsl:for-each-group select=".//programtest[@type='specifictestcase']" group-by="@casename">

次に、グループごとに、次のように成功数を取得します

<xsl:value-of select="count(current-group()[@result='succes'])"/>

(注意: XML にタイプミスがある可能性があります。「成功」ではなく「成功」ではないでしょうか?)

ここに完全な XSLT があります

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:template match="/report">
      <table>
         <tr>
            <th>**(Casename)**</th>
            <th>**(total success)**</th>
            <th>**(total failed)**</th>
         </tr>
         <xsl:for-each-group select=".//programtest[@type='specifictestcase']" group-by="@casename">
            <tr>
               <td>
                  <xsl:value-of select="current-grouping-key()"/>
               </td>
               <td>
                  <xsl:value-of select="count(current-group()[@result='succes'])"/>
               </td>
               <td>
                  <xsl:value-of select="count(current-group()[@result='failed'])"/>
               </td>
            </tr>
         </xsl:for-each-group>
      </table>
   </xsl:template>
</xsl:stylesheet>

サンプル XML に適用すると、次のように出力されます。

<table>
   <tr>
      <th>**(Casename)**</th>
      <th>**(total success)**</th>
      <th>**(total failed)**</th>
   </tr>
   <tr>
      <td>__temp1</td>
      <td>2</td>
      <td>0</td>
   </tr>
   <tr>
      <td>__temp2</td>
      <td>0</td>
      <td>2</td>
   </tr>
</table>
于 2012-06-04T10:01:24.830 に答える
1

まあやることで

<xsl:variable name="matchedElements" select="//*[starts-with(@casename, '__')]"/>
<xsl:variable name="unmatchedElements" select="//*[not(starts-with(@casename, '__'))]"/>

要素を見つけることができ、必要に応じて数値を出力できます。

<table>
  <thead>
    <tr>
     <th>matched</th>
     <th>not matched</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><xsl:value-of select="count($matchedElements)"/></td>
      <td><xsl:value-of select="count($unmatchedElements)"/></td>
    </tr>
  </tbody>
</table>

それは役に立ちますか?

私は単純に を使用starts-with(@casename, '__')しました。必要に応じて、もちろん@casename = '__temp1'や などの他のテストを使用できますmatches(@casename, 'some regular expression pattern here')

于 2012-06-04T09:22:25.497 に答える