2015-05-22 6 views
2

Я пытаюсь разобраться следующий XML с помощью XSLTСортировка элементов в XSLT 2.0

<Name>name3</Name> 
<Job>x</Job> 
<Name>name1</Name> 
<Job>y</Job> 
<Name>name2</Name> 

Ожидаемый выход является

<Name>name1</Name> 
<Job>x</Job> 
<Name>name2</Name> 
<Job>y</Job> 
<Name>name3</Name> 

Имя элементы должны быть отсортированы, сохраняя при этом элементы Job нетронутым. Я использую XSLT 2.0

Хотя я могу сортировать Имя элементы надлежащим образом с помощью XSL: вроде как указано в tutorial, выход я получаю следующим образом:

<Name>name1</Name> 
<Name>name2</Name> 
<Name>name3</Name> 
<Name>name3</Name> 
<Job>x</Job> 
<Name>name1</Name> 
<Job>y</Job> 
<Name>name2</Name> 

Я новичок в XSLT , Извините, если это очень простой вопрос. Спасибо заранее.

+1

Эта часть не ясна: "*, сохраняя при этом элементы Job нетронутым *". Измените свой пример и назначьте другое значение (или уникальный идентификатор) для каждого задания, чтобы мы могли определить, какой из них является. –

+0

Я обновил пример. – Abhinav

+0

Мы не можем сказать вам, что вы сделали неправильно, если не сообщите нам, что вы сделали. –

ответ

4

Извините, если это очень простой вопрос.

Нет, это совсем не просто. Попробуйте так:

XSLT 2,0

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

<xsl:variable name="sorted-names"> 
    <xsl:perform-sort select="/root/Name"> 
     <xsl:sort select="."/> 
    </xsl:perform-sort> 
</xsl:variable> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Name"> 
    <xsl:copy-of select="$sorted-names/Name[count(current()/preceding-sibling::Name) + 1]"/> 
</xsl:template> 

</xsl:stylesheet> 

Обратите внимание, что это предполагает хорошо сформированную ввод XML с единственным корневым элементом.

Демо: http://xsltransform.net/94hvTzG/1

+1

Для сортировки вы можете использовать 'perform-sort' вместо' for-each'. –

+0

@MartinHonnen Будет ли преимущество? –

+1

Вы сохранили бы строку кода, и вы использовали бы функцию XSLT 2.0, чтобы отсортировать последовательность. –

Смежные вопросы