XSLT 1.0 уникальные элементы - PullRequest
       4

XSLT 1.0 уникальные элементы

1 голос
/ 29 октября 2010

Я пытаюсь использовать предшествующий брат для выбора уникальных элементов в группе.

Используя в качестве примера следующий файл 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>

Я хочу иметь возможность выбирать уникальные элементы option-date (различаются по дате и data-ab). Я только хочу выбрать параметр-данные / дату, который является уникальным для каждого элемента, т. Е. Не по варианту. Я использовал комбинации предшествующего родного брата, но когда он возвращается к родителю, я могу только гарантировать, что даты будут уникальными для каждого варианта, где Мне нужно по пункту.

Я ломаю голову над этим часами и не могу придумать элегантного решения.

С уважением, Andy

1 Ответ

0 голосов
/ 29 октября 2010

Это преобразование:

<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) используется для трех сцепленных ключей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...