Я должен выбрать только уникальные записи из XML-документа в контексте цикла <xsl:for-each>
. Я ограничен Visual Studio с использованием XSL 1.0.Выбор уникальных записей в XSLT/XPath
<availList>
<item>
<schDate>2010-06-24</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>13:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-24</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>13:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-25</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>12:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-26</schDate>
<schFrmTime>13:00:00</schFrmTime>
<schToTime>14:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
<item>
<schDate>2010-06-26</schDate>
<schFrmTime>10:00:00</schFrmTime>
<schToTime>12:00:00</schToTime>
<variousOtherElements></variousOtherElements>
</item>
</availList>
Уникальность должна быть основана на значении трех дочерних элементов: schDate
, schFrmTime
и schToTime
. Если два элемента item
имеют одинаковые значения для всех трех дочерних элементов, они являются дубликатами. В приведенном выше XML элементы одного и двух дубликатов. Остальные уникальны. Как указано выше, каждый элемент содержит другие элементы, которые мы не хотим включать в сравнение. «Уникальность» должна быть фактором этих трех элементов, и только те.
Я попытался сделать это с помощью следующих действий:
availList/item[not(schDate = preceding:: schDate and schFrmTime = preceding:: schFrmTime and schToTime = preceding:: schToTime)]
Идея заключается в том, чтобы выбрать записи, где нет предшествующего элемента с тем же schDate
, schFrmTime
и schToTime
. Однако его выход отсутствует последний элемент. Это связано с тем, что мой XPath фактически исключает элементы, где все значения дочерних элементов сопоставлены во всем предыдущем документе. Ни один item
не соответствует всем дочерним элементам последнего элемента, но поскольку значение каждого элемента присутствует отдельно в другом элементе, последний элемент исключается.
я мог бы получить правильный результат, сравнивая всех значений дочерних как сцепленная строка в тех же сцепленных значения для каждого предыдущего элемента. Кто-нибудь знает, как я могу это сделать?
Хороший вопрос (+1). См. Мой ответ для XPath и XSLT-решений. –
Метод, использующий key(), обычно называется методом Muenchian: http://www.jenitennison.com/xslt/grouping/muenchian.html –