2015-10-28 9 views
0

Мне нужна помощь в сортировке xmlelements на основе другого xml. мой основной XML, как показано нижеxml сортировка по xslt

<xml> 
<A1>value</A1> 
<A2>value</A2> 
<B1>value</B1> 
<B2>value</B2> 
</xml> 

я хочу другой XML, который выглядит Liks это

<xml> 
<A1>value</A1> 
<B1>value</B1> 
<A2>value</A2> 
<B2>value</B2> 
</xml> 

sortign не на основе какой-либо клавиши или любое значение. упорядочение определяется «на лету» (путем считывания порядка из БД), и основной xml должен быть перенесен в этот порядок. от значений db равны

tagname | order 
------------ 
A1 | 1 
B1 | 2 
A2 | 3 
A3 | 4 

Как это сделать? Я могу динамически сформировать xslt. но что должно быть xslt?

Заранее спасибо.

+0

Я не понимаю ваш вопрос. Если порядок сортировки «не основан на каком-либо ключе или значении», то на чем он основан? XSLT может читать из исходного XML или из других документов, на которые вы указываете (в XSLT 1.0 тоже должны быть XML-документы). Он не может «читать из БД». –

+0

он не основан ни на одном ключе. у нас есть предопределенный список элементов, и упорядочение элементов определяется динамически. поэтому лучше, чтобы информация о заказе поступала из БД. Я могу прочитать значения db и сформировать xslt, написав программу C#. – user1447718

+0

Вы имеете в виду, что вы сами создаете XSLT «на лету»? Если да, можете ли вы вставить эту таблицу в виде XML - например: ''? –

ответ

1

Как насчет ...

<xsl:transform 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 
<xsl:output omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*" /> 

<xsl:variable name="elem-order" as="element(elem)*"> 
    <elem name="A1" /> 
    <elem name="B1" /> 
    <elem name="A2" /> 
    <elem name="B2" /> 
</xsl:variable> 

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|comment()|processing-instruction()|text()" /> 
    <xsl:apply-templates select="*"> 
     <xsl:sort select="index-of($elem-order, $elem-order[@name eq local-name(current())])" data-type="number" /> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

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

</xsl:transform> 

Если заказ элемента должны поступать из внешнего файла, переопределить переменный эль порядка $ как так ...

<xsl:variable 
    name="elem-order" 
    select="doc('what-ever-uri')/elements/elem" /> 

... или передать его в качестве параметра таблицы стилей.

+0

Можете ли вы дать мне основной xml, который будет работать с этим xsl? когда я пробую свой основной пример, он дает ошибку – user1447718

+0

Я не понимаю. Что такое основной xml? И что было сообщение об ошибке? –

+0

Спасибо Шон. Как должен выглядеть этот xml? значение значение значение значение user1447718

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