-1

integer = '4' のときに xslt を使用して以下の xml をグループ化し、各 dict をループして、各要素に integer = 5 があるかどうかを確認し、変数のみを渡すように設定する必要があります。また、整数値のいずれかが7 とステータスが不合格になります。

何か提案はありますか?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList1.0.dtd">
<plist version="1.0">
<dict>
<key>All Samples</key>
<array>
<dict>
<key>LogType</key>
<string>Start</string>
<key>Message</key>
<string>START:Certificate and Genre filter tests</string>
<key>Timestamp</key>
<date>2012-06-25T10:49:02Z</date>
<key>Type</key>
<integer>4</integer>
</dict>
<dict>
<key>LogType</key>
<string>Pass</string>
<key>Message</key>
<string>Navigation title bar should contain genre in card view : ACTION &amp; ADVENTURE</string>
<key>Timestamp</key>
<date>2012-06-25T10:49:13Z</date>
<key>Type</key>
<integer>5</integer>
</dict>
<dict>
<key>LogType</key>
<string>Pass</string>
<key>Message</key>
<string>START: certificate tests filter tests</string>
<key>Timestamp</key>
<date>2012-06-25T10:49:02Z</date>
<key>Type</key>
<integer>4</integer>
</dict>
<dict>
<key>LogType</key>
<string>Pass</string>
<key>Message</key>
<string>Navigation title bar should contain genre in card view : ACTION &amp; ADVENTURE</string>
<key>Timestamp</key>
<date>2012-06-25T10:49:13Z</date>
<key>Type</key>
<integer>5</integer>
</dict>
<dict>
<key>LogType</key>
<string>Fail</string>
<key>Message</key>
<string>Navigation title bar should contain genre in card view : ACTION &amp; ADVENTURE</string>
<key>Timestamp</key>
<date>2012-06-25T10:49:13Z</date>
<key>Type</key>
<integer>7</integer>
</dict>
</array>
</dict>
</plist>

expected result  in table view with format


| Test Name | test steps |   Test result|
START : GENRE FILTER TEST |    | FAIL ( background color to red)
test step1 | Navigation title bar should contain genre in card view | PASS
test step2 | Navigation title bar should contain genre in card view | FAIL

|START : certificate tests filter tests |    | PASS ( background color to green)
|test step 1 | Navigation title bar should contain genre in card view | PASS

ありがとう、ボブ

4

1 に答える 1

0

これを実現する 1 つの方法は、整数 = 4 の最初の先行兄弟によってdict要素を検索するキーを定義することです。

<xsl:key 
   name="test" 
   match="dict[integer[preceding-sibling::key[1]='Type']!=4]" 
  use="generate-id(
       preceding-sibling::dict[integer[preceding-sibling::key[1]='Type']=4][1]
    )" />

次に、すべてのdict要素を整数 = 4 と照合することから始めます。

<xsl:apply-templates 
   select="dict
     [key='All Samples']/array/dict[integer[preceding-sibling::key[1]='Type']=4]" />

そして、「失敗」要素が存在するテンプレートをテンプレートに記述し、それに応じてそれらを処理できます

<xsl:template 
   match="dict
     [key('test', generate-id())[string[preceding-sibling::key[1]='LogType']='Fail']]">

一致する他のすべてのdict要素は、成功要素になります。

そして、個々のテストごとに結果を出力するには、キーでそれらを検索するだけです

<xsl:apply-templates select="key('test', generate-id())" mode="results" />

dict要素に一致する複数のテンプレートがあり、それらを区別する必要があるため、モードが必要であることに注意してください。

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:key name="test" match="dict[integer[preceding-sibling::key[1]='Type']!=4]" use="generate-id(preceding-sibling::dict[integer[preceding-sibling::key[1]='Type']=4][1])"/>

   <xsl:template match="plist">
      <xsl:variable name="dicts" select="dict[key='All Samples']/array/dict[integer[preceding-sibling::key[1]='Type']=4]"/>       
      <table>
         <tr>
            <td>
               <xsl:text>Test Name</xsl:text>
            </td>
            <td>
               <xsl:text>Test Steps</xsl:text>
            </td>
            <td>
               <xsl:text>Test Result</xsl:text>
            </td>
         </tr>
      <xsl:apply-templates select="$dicts"/>
      </table>
      <xsl:variable name="fails" select="count($dicts[key('test', generate-id())[string[preceding-sibling::key[1]='LogType']='Fail']])" />
      <xsl:value-of select="concat('total tests passed = ', count($dicts) - $fails)" />
      <br />
      <xsl:value-of select="concat('total tests failed = ', $fails)" /> 
   </xsl:template>

   <xsl:template match="dict[key('test', generate-id())[string[preceding-sibling::key[1]='LogType']='Fail']]">
      <xsl:call-template name="dict">
         <xsl:with-param name="type" select="'Fail'"/>
         <xsl:with-param name="colour" select="'#FF0000'" />
      </xsl:call-template>
   </xsl:template>

   <xsl:template match="dict" name="dict">
      <xsl:param name="type" select="'Pass'"/>
      <xsl:param name="colour" select="'#00FF00'" />
      <tr>
         <td>
            <xsl:value-of select="string[preceding-sibling::key[1]='Message']"/>
         </td>
         <td>
         </td>
         <td style="background-color:{$colour}">
            <xsl:value-of select="$type"/>
         </td>
      </tr>
      <xsl:apply-templates select="key('test', generate-id())" mode="results" />
   </xsl:template>

   <xsl:template match="dict" mode="results">
      <tr>
         <td>
            <xsl:value-of select="concat('Test Step ', position())" />
         </td>
         <td>
            <xsl:value-of select="string[preceding-sibling::key[1]='Message']"/>
         </td>
         <td>
            <xsl:value-of select="string[preceding-sibling::key[1]='LogType']"/>
         </td>
      </tr>
   </xsl:template>
</xsl:stylesheet>

XML サンプルに適用すると、以下が出力されます。

<table>
  <tr>
     <td>Test Name</td>
     <td>Test Steps</td>
     <td>Test Result</td>
  </tr>
  <tr>
     <td>START:Certificate and Genre filter tests</td>
     <td/>
     <td style="background-color:#00FF00">Pass</td>
  </tr>
  <tr>
     <td>Test Step 1</td>
     <td>Navigation title bar should contain genre in card view : ACTION &amp; ADVENTURE</td>
     <td>Pass</td>
  </tr>
  <tr>
     <td>START: certificate tests filter tests</td>
     <td/>
     <td style="background-color:#FF0000">Fail</td>
  </tr>
  <tr>
     <td>Test Step 1</td>
     <td>Navigation title bar should contain genre in card view : ACTION &amp; ADVENTURE</td>
     <td>Pass</td>
  </tr>
  <tr>
     <td>Test Step 2</td>
     <td>Navigation title bar should contain genre in card view : ACTION &amp; ADVENTURE</td>
     <td>Fail</td>
  </tr>
</table>
total tests passed = 1 
<br/>
total tests failed = 1 

名前付きテンプレートを使用して、「成功」行と「失敗」行の共有コードを利用することに注意してください。

于 2012-06-26T07:54:35.200 に答える