2014-10-29 2 views
-1

Это мой XML:Проверьте, по крайней мере, один элемент отличается

<SECTION_CONTENT_LIST_ITEM> <------- First Group 
    <NTC_LIGHTLISTPRODUCT> 
     <IMMUTABLE_ID>5585</IMMUTABLE_ID> 
     <INTERNATIONAL_LIGHT_NUMBER>E1283</INTERNATIONAL_LIGHT_NUMBER> 
     <VICINITY>LA SPEZIA</VICINITY> 
     <LIGHT_INFORMATION_LIST> 
      <LIGHT_INFORMATION> 
       <LIGHT_COLOUR>G</LIGHT_COLOUR> <-- LIGHT_COLOUR G 
       <LIGHT_HEIGHT>8</LIGHT_HEIGHT> 
       <LIGHT_RANGE>3</LIGHT_RANGE> <-- LIGHT_RANGE 3 
       <LIGHT_STATUS>Priv</LIGHT_STATUS> 
      </LIGHT_INFORMATION> 
      <LIGHT_INFORMATION> 
       <LIGHT_COLOUR>R</LIGHT_COLOUR> <-- LIGHT_COLOUR R 
       <LIGHT_HEIGHT>6</LIGHT_HEIGHT> 
       <LIGHT_RANGE>3</LIGHT_RANGE> <-- LIGHT_RANGE 3 
       <LIGHT_STATUS>Priv</LIGHT_STATUS> 
      </LIGHT_INFORMATION> 
     </LIGHT_INFORMATION_LIST> 
    </NTC_LIGHTLISTPRODUCT>  
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> <--- Second Group 
    <NTC_LIGHTLISTPRODUCT> 
     <IMMUTABLE_ID>5586</IMMUTABLE_ID> 
     <INTERNATIONAL_LIGHT_NUMBER>E1324</INTERNATIONAL_LIGHT_NUMBER> 
     <VICINITY>LERICI</VICINITY> 
     <LIGHT_INFORMATION_LIST> 
      <LIGHT_INFORMATION> 
       <LIGHT_COLOUR>G</LIGHT_COLOUR> <-- LIGHT_COLOUR G 
       <LIGHT_HEIGHT>7</LIGHT_HEIGHT> 
       <LIGHT_RANGE>3</LIGHT_RANGE>  <-- LIGHT_RANGE 3 
       <LIGHT_STATUS>Priv</LIGHT_STATUS> 
      </LIGHT_INFORMATION> 
      <LIGHT_INFORMATION> 
       <LIGHT_COLOUR>G</LIGHT_COLOUR> <-- LIGHT_COLOUR G 
       <LIGHT_HEIGHT>6</LIGHT_HEIGHT> 
       <LIGHT_RANGE>3</LIGHT_RANGE>  <-- LIGHT_RANGE 3 
       <LIGHT_STATUS>Priv</LIGHT_STATUS> 
      </LIGHT_INFORMATION> 
     </LIGHT_INFORMATION_LIST> 
    </NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 
<SECTION_CONTENT_LIST_ITEM> <--- Third Group 
    <NTC_LIGHTLISTPRODUCT> 
     <IMMUTABLE_ID>5574</IMMUTABLE_ID> 
     <INTERNATIONAL_LIGHT_NUMBER>E1328.5</INTERNATIONAL_LIGHT_NUMBER> 
     <VICINITY>MARINA DI CARRARA</VICINITY> 
     <LIGHT_INFORMATION_LIST> 
      <LIGHT_INFORMATION> 
       <LIGHT_COLOUR>W-G</LIGHT_COLOUR> <-- Contains'-', go to the next 
       <LIGHT_SIGNAL_GROUP>()</LIGHT_SIGNAL_GROUP> 
       <LIGHT_HEIGHT>32</LIGHT_HEIGHT> 
       <LIGHT_RANGE>12</LIGHT_RANGE>  
       <LIGHT_STATUS>Priv</LIGHT_STATUS> 
     </LIGHT_INFORMATION> 
     <LIGHT_INFORMATION> 
       <LIGHT_COLOUR>R</LIGHT_COLOUR> <-- LIGHT_COLOUR R 
       <LIGHT_HEIGHT>32</LIGHT_HEIGHT> 
       <LIGHT_RANGE>10</LIGHT_RANGE> <-- LIGHT_RANGE 10 
       <LIGHT_STATUS>Priv</LIGHT_STATUS> 
     </LIGHT_INFORMATION> 
     <LIGHT_INFORMATION> 
       <LIGHT_COLOUR>G</LIGHT_COLOUR> <-- LIGHT_COLOUR G 
       <LIGHT_HEIGHT>32</LIGHT_HEIGHT> 
       <LIGHT_RANGE>10</LIGHT_RANGE> <-- LIGHT_RANGE 10 
       <LIGHT_STATUS>Priv</LIGHT_STATUS> 
     </LIGHT_INFORMATION> 
     <LIGHT_INFORMATION> 
       <LIGHT_COLOUR>W</LIGHT_COLOUR> <-- LIGHT_COLOUR W 
       <LIGHT_HEIGHT>32</LIGHT_HEIGHT> 
       <LIGHT_RANGE>12</LIGHT_RANGE> <-- LIGHT_RANGE 12 
       <LIGHT_STATUS>Priv</LIGHT_STATUS> 
     </LIGHT_INFORMATION> 
    </LIGHT_INFORMATION_LIST> 
</NTC_LIGHTLISTPRODUCT> 
</SECTION_CONTENT_LIST_ITEM> 

Это мой XSLT:

<td style="text-align:center; width:0.99cm; color:red; padding-left:3; padding-right:3" valign="top"> 
     <xsl:for-each select="LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_RANGE[not(contains(preceding-sibling::LIGHT_COLOUR, '-'))]"> 

      <!-- Prendo le lettere dei colori in LIGHT_COLOUR--> 
      <xsl:variable name="LCorrente" select="preceding-sibling::LIGHT_COLOUR"/>                               
      <xsl:variable name="LPrecedente" select="preceding::LIGHT_RANGE[1][not(contains(preceding-sibling::LIGHT_COLOUR, '-'))][preceding::IMMUTABLE_ID = $EF]/preceding-sibling::LIGHT_COLOUR"/> 

      <!-- Prendo i numeri di portata in LIGHT_RANGE--> 
      <xsl:variable name="NCorrente" select="number(.)"/> 
      <xsl:variable name="NPrecedente" select="number(preceding::LIGHT_RANGE[1][not(contains(preceding-sibling::LIGHT_COLOUR, '-'))][preceding::IMMUTABLE_ID=$EF])"/> 

      <xsl:if test="not($LPrecedente) or $LPrecedente != $LCorrente" > 
       <xsl:value-of select="$LCorrente"/> 
       <xsl:text> </xsl:text> 
       <xsl:value-of select="$NCorrente"/> 
       <br/>                 
      </xsl:if> 

     </xsl:for-each> 
</td> 

Это выход:

enter image description here Коррекция сделать является следующим:

enter image description here

Объясняю:

В первом случае:
LIGHT_RANGE для всех элементов равно 3 (или другое число) в этом случае не имеет значения LIGHT_COLOUR на выходе я бы «3»;

Во втором случае:
LIGHT_COLOUR и LIGHT_RANGE - это то же самое, напишите '3';

В третьем случае:
Если Light_COLOUR содержит '-' перейти к следующему. Если по крайней мере один LIGHT_RANGE отличается друг от друга, он должен также учитывать характеристики каждого из них и получать на выходе: R 10 - G 10 и W 12

+3

Что вы показываете нам НЕ [Muenchian grouping] (http: // www .jenitennison.com/XSLT/группировка/muenchian.html). –

+0

Спасибо, Майкл, не является Muenchian Grouping. –

ответ

0
<xsl:choose> 
    <xsl:when test="count(LIGHT_INFORMATION_LIST//LIGHT_RANGE) = count(LIGHT_INFORMATION_LIST//LIGHT_RANGE[. = (current()//LIGHT_RANGE)[1]])='false'"> 
     <xsl:for-each select="LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_RANGE[not(. = preceding::LIGHT_RANGE[preceding::IMMUTABLE_ID=$EF])]"> 
      <xsl:value-of select="."/> 
     </xsl:for-each> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:for-each select="LIGHT_INFORMATION_LIST/LIGHT_INFORMATION/LIGHT_RANGE[not(contains(preceding-sibling::LIGHT_COLOUR, '-'))]"> 
     <!-- Prendo le lettere dei colori in LIGHT_COLOUR--> 
     <xsl:variable name="LCorrente" select="preceding-sibling::LIGHT_COLOUR"/>                               
     <xsl:variable name="LPrecedente" select="preceding::LIGHT_RANGE[1][not(contains(preceding-sibling::LIGHT_COLOUR, '-'))][preceding::IMMUTABLE_ID = $EF]/preceding-sibling::LIGHT_COLOUR"/> 

     <!-- Prendo i numeri di portata in LIGHT_RANGE--> 
     <xsl:variable name="NCorrente" select="number(.)"/> 
     <xsl:variable name="NPrecedente" select="number(preceding::LIGHT_RANGE[1][not(contains(preceding-sibling::LIGHT_COLOUR, '-'))][preceding::IMMUTABLE_ID=$EF])"/> 

     <xsl:if test="not($LPrecedente) or $LPrecedente != $LCorrente" > 
      <xsl:value-of select="$LCorrente"/> 
      <xsl:text> </xsl:text> 
      <xsl:value-of select="$NCorrente"/> 
      <br/>                 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:otherwise> 
</xsl:choose> 
Смежные вопросы