在不重复xslt 1.0的情况下将所有元素区分开来

时间:2013-12-12 15:07:09

标签: xml xslt-1.0

从我的XML代码中我想一次性拿走所有项目而不重复。 我的Xml代码是:

      <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),我用它来保留在这个节点内。

“你”可以给我更多指示吗?致谢

1 个答案:

答案 0 :(得分:3)

在XSLT 1.0中对此类问题进行分组的标准方法称为“Muenchian分组” - 基本上您定义了一个密钥,它将应被视为“相同”的节点分组,然后使用使用generate-id来处理每个组中的第一个节点。

在这种情况下,分组约束是LIGHT_SUPPORT_HEIGHT值本身和包含NTC_LIGHTLISTPRODUCT的{​​{1}}的值的组合:

IMMUTABLE_ID

现在您可以使用

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