2014-01-14 4 views
0

Я пытаюсь сохранить порядок оригинальных узлов в преобразовании XSLT, например:XSLT Сохранить Заказать

Я следующий файл

<?xml version="1.0" encoding="ISO-8859-1"?> 
<catalog> 
    <cd1></cd1> 
    <cd2></cd2> 
    <cd2></cd2> 
    <cd1></cd1> 
</catalog> 

Это мой файл XSLT

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<root> 
     <xsl:for-each select="catalog/cd1"> 
     <node>1</node> 
     </xsl:for-each> 
     <xsl:for-each select="catalog/cd2"> 
     <node>2</node> 
     </xsl:for-each> 
</root> 
</xsl:template> 
</xsl:stylesheet> 

желаемый результат:

<?xml version="1.0"?> 
<root> 
    <node>1</node> 
    <node>2</node> 
    <node>2</node> 
    <node>1</node> 
</root> 

Но на самом деле:

<?xml version="1.0"?> 
<root> 
    <node>1</node> 
    <node>1</node> 
    <node>2</node> 
    <node>2</node> 
</root> 

Есть ли способ, чтобы сохранить порядок узлов?

ответ

0

Вместо того, чтобы использовать xsl:for-each (что вам следует избегать, когда это возможно), напишите шаблоны, соответствующие элементам cd.

Проблема с вашим подходом

Если вы написать свой for-each так:

<xsl:for-each select="catalog/cd1"> 

вы вынуждаете XSLT обрабатывать все дочерние узлы catalog, которые называются "CD1" первый. То есть, он только начнет обрабатывать второй for-each, когда все элементы cd1 будут обработаны.

стилевых

<?xml version="1.0" encoding="utf-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/catalog"> 
    <root> 
    <xsl:apply-templates/> 
    </root> 
</xsl:template> 

<xsl:template match="cd1"> 
    <node>1</node> 
</xsl:template> 

<xsl:template match="cd2"> 
    <node>2</node> 
</xsl:template> 

</xsl:stylesheet> 

Выход

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <node>1</node> 
    <node>2</node> 
    <node>2</node> 
    <node>1</node> 
</root> 
+0

Если он ограничен CD1 и CD2, я бы не предложил что-то подобное, если количество пронумерованных дочерних узлов неизвестно ... –

+0

Почему бы и нет? Какова ваша оговорка? –

+0

Если у него есть узел cd3, то он должен добавить новое правило. На следующий день после выхода cd4, и ему нужно будет добавить еще одно правило. Значение может быть просто неизвестно (потому что это просто, как произвольное приложение экспортирует данные) и ...? Он должен установить очень высокий предел, как cd99, чтобы спать сладкие сны? –

1

Я нашел обходной путь, чтобы сделать это, для, каждый принимает несколько путей, а не только один, например:

<xsl:for-each select="catalog/cd1 | catalog/cd2"> 

С этот подход я получил желаемый результат :)

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