XSLT 1.0独特元素

时间:2010-10-28 22:26:41

标签: xslt

我正在尝试使用previous-sibling从组中选择唯一元素。

使用folliwng xml作为示例..

<items>
 <item>
  <options>
   <option>
    <option-data>
     <data-ab>TEST1</date-qualifier>
     <date>20101026</date>
    </option-data>
    <option-data>
     <data-ab>TEST2</date-qualifier>
     <date>20101026</date>
    </option-data>

   </option>
   <option type="2">
    <option-data>
     <data-ab>TEST1</date-qualifier>
     <date>20101026</date>
    </option-data>
   </option>
  </options>
 </item>
 <item>
  <options>
   <option>
    <option-data>
     <data-ab>TEST1</date-qualifier>
     <date>20101026</date>
    </option-data>
   </option>
   <option type="2">
    <option-data>
     <data-ab>TEST1</date-qualifier>
     <date>20101026</date>
    </option-data>
   </option>
  </options>
 </item>
</items>

我希望能够选择唯一的选项日期元素(不同的是按日期和数据-ab)。我只想为每个项目选择唯一的选项数据/日期,即不是通过选项。我使用了前兄弟的组合,但是当它返回到父级时我只能保证日期对于每个选项都是唯一的我需要按项目。

将我的大脑绞尽脑汁几个小时,无法想出一个优雅的解决方案。

此致 安迪

1 个答案:

答案 0 :(得分:0)

此转化:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kODByVal" match="option-data"
  use="concat(generate-id(ancestor::item[1]), '+', data-ab, '+', date)"/>

  <xsl:template match="item">

  Unique option-data elements for item: <xsl:text/>
  <xsl:value-of select="concat(position(), '&#xA;')"/>

  <xsl:copy-of select=
  "*/*/option-data[generate-id()
                  =
                   generate-id(key('kODByVal',
                               concat(generate-id(current()), '+',
                                      data-ab,
                                      '+',
                                      date)
                               )[1])
                  ]
  "/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档(已更正以实现良好格式):

<items>
    <item>
        <options>
            <option>
                <option-data>
                    <data-ab>TEST1</data-ab>
                    <date>20101026</date>
                </option-data>
                <option-data>
                    <data-ab>TEST2</data-ab>
                    <date>20101026</date>
                </option-data>
            </option>
            <option type="2">
                <option-data>
                    <data-ab>TEST1</data-ab>
                    <date>20101026</date>
                </option-data>
            </option>
        </options>
    </item>
    <item>
        <options>
            <option>
                <option-data>
                    <data-ab>TEST1</data-ab>
                    <date>20101026</date>
                </option-data>
            </option>
            <option type="2">
                <option-data>
                    <data-ab>TEST1</data-ab>
                    <date>20101026</date>
                </option-data>
            </option>
        </options>
    </item>
</items>

生成想要的正确结果

  Unique option-data elements for item: 1
<option-data><data-ab>TEST1</data-ab><date>20101026</date></option-data>
<option-data><data-ab>TEST2</data-ab><date>20101026</date></option-data>

  Unique option-data elements for item: 2
<option-data><data-ab>TEST1</data-ab><date>20101026</date></option-data>

请注意:最有效的XSLT 1.0(Muenchian)分组方法用于三个连接键。