0

次の XML があります。

 <discrepancyModel>
     <MissingSuppliers isMissingSuppliersCheckApplied="true">
            <SnsCode value="str1234" mi="GRAA350RR" syst="29" subsys="2"
    subsubsys="1" assy="XX" />
            <SnsCode value="str1234" mi="GRAA350RR" syst="29" subsys="2"
    subsubsys="3" assy="XX" />
            <SnsCode value="str1234" mi="TRENTXWB" syst="28" subsys="1"
    subsubsys="1" assy="XX" />
            <SnsCode value="str1234" mi="TRENTXWB" syst="29" subsys="1"
    subsubsys="1" assy="57" />
            <SnsCode value="str1234" mi="TRENTXWC" syst="29" subsys="1"
    subsubsys="1" assy="58" />
            <SnsCode value="str1234" mi="TRENTXWD" syst="29" subsys="1"
    subsubsys="1" assy="58" />
        </MissingSuppliers>
    </discrepancyModel>

予想される出力は次のとおりです。

ここでは、各 SNSCODE の情報をテーブル行に表示する必要があります。@mi の値が同じ SNSCODE が 2 つ以上ある場合、SNSCODE は 1 回だけ書き込まれますが、その前に複数の行があります (つまり、1 列目が結合されます)。

私が立ち往生している主な問題は、行に別の色が必要ですが、それを達成できないことです。以前の回答はすべて見ましたが、問題は解決しません。

次の xslt コードがあります。

<table border="1">
  <tr>
    <th>Name (MI)</th>
    <th>systemCode</th>
    <th>subSystemCode</th>
    <th>subSubSystemCode</th>
    <th>assyCode</th>
  </tr>
  <xsl:for-each select="//SnsCode">
    <xsl:variable name="tmp">
      <xsl:value-of select="./@mi" />
    </xsl:variable>
    <xsl:if test="generate-id(.) = generate-id(key('stvalkey',$tmp)[1])">
      <xsl:variable name="miNumber" select="count(key('stvalkey',$tmp))" />
      <xsl:for-each select="//SnsCode[@mi=$tmp]">
        <xsl:value-of select="count(preceding-sibling::SnsCode)" />
        <tr>
          <xsl:attribute name="class">
            <xsl:if test="position() mod 2 = 0">
              <xsl:value-of select="'odd'" />
            </xsl:if>
          </xsl:attribute>
          <xsl:if test="position()=1">
            <td>
              <xsl:attribute name="rowspan">
                <xsl:value-of select="$miNumber" />
              </xsl:attribute>
              <xsl:value-of select="$tmp" />
            </td>
          </xsl:if>
          <td>
            <xsl:value-of select="./@syst" />
          </td>
          <td>
            <xsl:value-of select="./@subsys" />
          </td>
          <td>
            <xsl:value-of select="./@subsubsys" />
          </td>
          <td>
            <xsl:value-of select="./@assy" />
          </td>
        </tr>
      </xsl:for-each>
    </xsl:if>
  </xsl:for-each>
</table>

色付けに使用されるこのコードは次のとおりです。

 <xsl:attribute name="class">
   <xsl:if test="position() mod 2 = 0">
     <xsl:value-of select="'odd'"/>
   </xsl:if>
 </xsl:attribute> 

これに関する問題は、ループ内でこのコードを使用すると、行全体が色付けされず、mi 値内の 2 番目の行のみが色付けされることです。

一方、このコードをループの外側で使用すると、要素の位置が 1,2,3,4 として取得されません....しかし、値が 1,3,5,6 として取得されるのは、2 つあるためです。 1 番目の値のオカレンスと 2 番目の値の 2 オカレンスなど。

この場合、誰でも着色を行う方法を提案できますか?

4

2 に答える 2