2013-12-12 2 views
0

Из моего XML-кода я хочу взять все предметы сразу без повторения. Мой Xml код:Возьмите все элементы без повторения xslt 1.0

 <NTC_LIGHTLISTPRODUCT> 
     <IMMUTABLE_ID>9814</IMMUTABLE_ID> 
     <LIGHT_DESCRIPTION_LIST>    
      <LIGHT_DESCRIPTION>     
       <LIGHT_SUPPORT_HEIGHT>198</LIGHT_SUPPORT_HEIGHT> 
      </LIGHT_DESCRIPTION> 
      <LIGHT_DESCRIPTION>     
       <LIGHT_SUPPORT_HEIGHT>166</LIGHT_SUPPORT_HEIGHT> 
      </LIGHT_DESCRIPTION> 
      <LIGHT_DESCRIPTION>     
       <LIGHT_SUPPORT_HEIGHT>122</LIGHT_SUPPORT_HEIGHT> 
      </LIGHT_DESCRIPTION> 
      <LIGHT_DESCRIPTION>     
       <LIGHT_SUPPORT_HEIGHT>76</LIGHT_SUPPORT_HEIGHT> 
      </LIGHT_DESCRIPTION> 
      <LIGHT_DESCRIPTION>     
       <LIGHT_SUPPORT_HEIGHT>31</LIGHT_SUPPORT_HEIGHT> 
      </LIGHT_DESCRIPTION> 
      <LIGHT_DESCRIPTION>     
       <LIGHT_SUPPORT_HEIGHT>31</LIGHT_SUPPORT_HEIGHT> 
      </LIGHT_DESCRIPTION>    
     </LIGHT_DESCRIPTION_LIST> 
     <NTC_LIGHTLISTPRODUCT> 

Я хочу последовательность: 198 166 122 76 31.

Я написал этот код XSLT 1.0, но я не могу получить правильный результат:

<xsl:for-each select="LIGHT_DESCRIPTION"> 
    <xsl:for-each select="LIGHT_SUPPORT_HEIGHT"> 
     <xsl:if test=".=not(preceding::LIGHT_SUPPORT_HEIGHT[1][preceding::IMMUTABLE_ID=$EF])"> 
      <span style="font-size:9pt; text-align:center; "> 
       <xsl:value-of select="."/> 
      </span> 
     </xsl:if> 
</xsl:for-each> 

EF - это переменная текущего узла (IMMUTABLE ID), и я использую это, чтобы оставаться внутри этого узла.

Может «вы» дать мне больше инструкций? БЛАГОДАРЯ

+0

Ваш фрагмент кода не соответствует примеру XML - откуда происходит 'IMMUTABLE_ID'? –

+0

immutable_ID - это переменная, которая идентифицирует каждый узел ... есть много описания этого узла. –

ответ

3

Стандартный подход к группировке проблем, как это в XSLT 1.0 называется «Muenchian группировка» - по существу, мы определим ключ, что группы узлов, которые должны рассматриваться как «то же самое», а затем использовать трюк с generate-id для обработки только первого узла в каждой группе.

В этом случае группировка ограничение представляет собой сочетание стоимости самого LIGHT_SUPPORT_HEIGHT, а значение вмещающего NTC_LIGHTLISTPRODUCT «s IMMUTABLE_ID:

<xsl:key name="supportHeightKey" match="LIGHT_SUPPORT_HEIGHT" 
    use="concat(., '|', ancestor::NTC_LIGHTLISTPRODUCT[1]/IMMUTABLE_ID)" /> 

Теперь вы можете выбрать уникальные значения, используя

<!-- assuming the current context is LIGHT_DESCRIPTION_LIST --> 
<xsl:for-each select="LIGHT_DESCRIPTION/LIGHT_SUPPORT_HEIGHT[ 
    generate-id() = generate-id(
     key('supportHeightKey', concat(., '|', current()/../IMMUTABLE_ID))[1])]"> 
    <span style="font-size:9pt; text-align:center; "> 
    <xsl:value-of select="."/> 
    </span> 
</xsl:for-each> 
+0

спасибо за ваше объяснение было очень полезно, чтобы понять, как решить мою проблему XSLT. –

Смежные вопросы