2016-11-21 5 views
3

я копирование XML-документ и добавить атрибут к определенным узлам (см xslt how to add attributes to copy-of)XSLT: Позиционирование добавляемого атрибута

Дело в том, мои узлы уже есть некоторые существующие атрибуты, Fe:

<element id="123" dbfield="table"> 

Когда я добавить новый атрибут, он получает расположен в передней части первого атрибута, так же, как что:

<element version="default" id="123" dbfield="table"> 

Я предпочел бы иметь его в качестве последнего атрибута, как это:

<element id="123" dbfield="table" version="default"> 

Есть ли способ, чтобы установить положение новой «версии» атрибута по? Спасибо за помощь!

+0

Порядок атрибутов не имеет значения. Что бы вы хотели сделать? – potame

+0

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

+0

@ brun0 Какой конкретный процессор вы используете? –

ответ

1

Язык XSLT не предоставляет способ управления порядком атрибутов, поскольку XML language specification явно указывает, что порядок атрибутов не имеет значения.

Тем не менее, большинство процессоров выпишут атрибуты в порядке инструкций, выданных им - так что вам просто нужно изменить порядок из (предположительно, так как вы не показать текущий код):

<xsl:template match="element"> 
    <xsl:copy> 
     <xsl:attribute name="version">default</xsl:attribute> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

к:

<xsl:template match="element"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:attribute name="version">default</xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 
+0

Обратите внимание, что эти два правила шаблонов имеют другой эффект, если существующий 'element' уже имеет атрибут' version'. Когда вы пишете два атрибута с тем же именем, выигрывает последний. –

+0

Спасибо вам за помощь! – brun0

2

Последние версии Saxon (PE и EE) имеют свойство сериализации saxon:attribute-order. Запись:

<xsl:output saxon:attribute-order="id dbfield version"/> 

гарантирует, что атрибуты, соответствующие эти имена сериализуются в установленном порядке, а затем атрибуты, которые не присутствуют в списке.

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