2016-04-19 4 views
0

Я сортирую список XSL с помощью Xpath.XPath Custom Sort Expression

Я хочу, чтобы отсортировать его по хронологии, что легко, но некоторые элементы списка имеют дубликаты заголовков, и я хочу, чтобы они были сгруппированы вместе, даже если они новее. Например:

элемент списка А (созданный 4/19)

элемент списка B (созданный 4/18)

Дубликат элемента списка B (созданный 4/21)

элемент списка C (созданный 4/17)

- ключом здесь является обеспечение того, чтобы «Дублирующий элемент списка B» появился под оригиналом, даже если он является самым новым.

В настоящее время мое выражение состоит только из «@Created», которое отображает элементы в порядке убывания. Мне нужно выражение, которое говорит «Сортировка по дате создания, если заголовок не содержит слово« дубликат »- в этом случае сортируйте их по алфавиту«

Может ли кто-нибудь предложить собственное выражение Xpath, которое достигает этого?

Спасибо.

EDIT: Вот окно, в котором я бы ввел выражение Xpath. Опять же, только 2 строки, мне нужно беспокоиться о которых @title и @ Created_x0020_Date

pic

+0

Сначала отгруппируйте группы и отсортируйте их по каждой группе. Используете ли вы XSLT 2.0? –

+0

Пожалуйста, покажите фактический XML-контент, чтобы узнать, как размещаются значения (текст, атрибут, родительский элемент, дочерний элемент и т. Д.). – Parfait

+0

@Parfait У меня нет необработанного XML. Это часть веб-части sharepoint, которая просто создает для вас XSL. По-прежнему это не должно быть необходимо для этого. То, что происходит, - это элементы списка, которые содержат строки для даты создания и объекта. Мне нужно только выражение Xpath, которое говорит «Сортировать по дате», если только тема не содержит «Дублировать», и в этом случае сортируйте их по алфавиту ». –

ответ

1

Без кода идти я собираюсь сделать много предположений. Учитывая следующий XML-блок:

<data> 
    <block created="20160419" label="A"/> 
    <block created="20160418" label="B"/> 
    <block created="20160421" label="B"/> 
    <block created="20160417" label="C"/> 
</data> 

Вам нужно будет использовать ключи, чтобы заставить это работать. Я предполагаю XSLT 1.0 таким образом, что он будет совместим с тем, что вы используете.

<xsl:key name="labels" match="/data/block" use="@label" /> 

<xsl:template match="/"> 
    <html lang="en"> 
     <head></head> 
     <body> 
      <xsl:for-each select="/data/block[generate-id(.) = generate-id(key('labels', @label))]"> 
       <xsl:sort select="@created" data-type="number"/> 
       <xsl:for-each select="key('labels', @label)"> 
        <xsl:sort select="@created" data-type="number"/> 

        <p><xsl:value-of select="@label"/> - <xsl:value-of select="@created"/></p> 
       </xsl:for-each> 
      </xsl:for-each> 
     </body> 
    </html> 
</xsl:template> 

В основном то, что мы делаем здесь, создав ключ к петле над каждым блоком на основе отдельного значения @label, отсортированные по @created стоимости. Оттуда, цикл снова над каждым блоком, используя текущую @label как переменную и сортировать еще раз по дате создания.

Это дает мне следующий вывод:

<p>C - 20160417</p> 
<p>B - 20160418</p> 
<p>B - 20160421</p> 
<p>A - 20160419</p> 

Очевидно, что это очень грубо, и не использовать шаблоны, как и должно быть, но, надеюсь, это объясняет концепции достаточно хорошо для вас, чтобы быть в состоянии понять, что происходит и переводит его на ваш собственный код!

+0

+1. Поскольку у вас установлен ключ, '' должен просто быть ключ '', чтобы следовать методу текстовой книги для доступа к текущей группе с Muenchian grouping. –

+0

Спасибо @ martin-honnen, я знал, что должен быть более простой способ сделать это! Я буду обновлять свой ответ с помощью вашего кода. –

+0

Красиво сделано! Спасибо всем за помощь. –