2015-05-28 3 views
0

У меня есть XML-файл, который является объединением двух меньших XML-файлов. Хотя каждый из двух файлов имеет разные закрывающие теги, оба имеют определенное поле с тем же именем, которое я хотел бы сортировать, используя только XSLT 1.0.XSL: Сортировка по гибридному файлу XML

Я создал следующие файлы XML/XSLT, чтобы продемонстрировать проблему.

желаемого выход: 1,2,3,4,5,6

Но фактическая выход является: 1,3,5,2,4,6

Другими словами, каждый суб-файл (<DataSet1> и <DataSet2>) сортируется правильно, но желательно результатом является правильный выбор файла в целом.

Как исправить эту проблему? (Обратите внимание, что я не могу изменить файл XML в любом случае ниже уровня <DataSet1> и <DataSet2>.)

<?xml version="1.0" encoding="UTF-8"?> 
<xml-file> 
    <DataSet1> 
     <Table1> 
      <Rank>1</Rank> 
     </Table1> 
     <Table1> 
      <Rank>5</Rank> 
     </Table1> 
     <Table1> 
      <Rank>3</Rank> 
     </Table1> 
    </DataSet1> 
    <DataSet2> 
     <Table2> 
      <Rank>6</Rank> 
     </Table2> 
     <Table2> 
      <Rank>2</Rank> 
     </Table2> 
     <Table2> 
      <Rank>4</Rank> 
     </Table2> 
    </DataSet2> 
</xml-file> 

Вот файл XSLT Я использую:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 

    <xsl:template match="DataSet1|DataSet2"> 
     <xsl:apply-templates> 
      <xsl:sort select="Rank" order="ascending" /> 
     </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="Table1"> 
     <xsl:value-of select="Rank"/><br/> 
    </xsl:template> 

    <xsl:template match="Table2"> 
     <xsl:value-of select="Rank"/><br/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Не понимая свой вопрос здесь. Если вы не можете разделить каждый тег '', как вы ожидаете, что ваши таблицы будут отсортированы в соответствии с вашими критериями? Можете ли вы включить свой вывод как полный XML? –

+0

http://stackoverflow.com/help/someone-answers –

ответ

0

Проблема с вашим подходом заключается в том, что этот шаблон:

<xsl:template match="DataSet1|DataSet2"> 

Фактически создается экземпляр дважды - один раз для каждого DataSet. И каждый экземпляр сортирует свои собственные узлы, поэтому в итоге вы получаете две группы рангов, каждая из которых сортируется внутри. Попробуйте вместо этого:

<xsl:template match="/xml-file"> 
    <xsl:apply-templates select="DataSet1/Table1 | DataSet2/Table2"> 
     <xsl:sort select="Rank" data-type="number" order="ascending"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="Table1 | Table2"> 
    <xsl:value-of select="Rank"/><br/> 
</xsl:template> 

Или, если вы предпочитаете:

<xsl:template match="/xml-file"> 
    <xsl:apply-templates select="*/*/Rank"> 
     <xsl:sort select="." data-type="number" order="ascending"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="Rank"> 
    <xsl:value-of select="."/><br/> 
</xsl:template> 
Смежные вопросы