2015-12-13 2 views
0

с помощью XSLT 1.0 на Python, я пытаюсь выбрать несколько пунктов, в то время как с указанием порядка:Выбор из XML определения порядка

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
<item name='1'> 
first 
</item> 
<item name='2'> 
second 
</item> 
<item name='3'> 
third 
</item> 
</items> 

Если я использую для-каждый с большим соединены через список, Я могу получить нужные элементы, но только в исходном порядке исходного документа xml.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
     <xsl:for-each select="items/item[@name='2']|items/item[@name='1']"> 
<p>hi</p> 
<xsl:value-of select="." /> 
</xsl:for-each> 
    </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Это дает:

hi 
first 
hi 
second 

Но я хотел бы иметь его вывод:

hi 
second 
hi 
first 

Я думаю, что с помощью XSL: Наносить-шаблоны могут быть путь, но я не может заставить его работать даже с этим простым примером. Каков наилучший способ в xslt 1.0 выбрать элементы в определенном порядке?

+1

См. Ответ, который предоставил har07 (с помощью двух шаблонов 'apply-templates'), оператор объединения' | ', который вы используете, сортирует его операнды в порядке документа, поэтому ваша попытка с помощью элементов' select = "item/item [@ name = '2'] | items/item [@ name = '1'] "' не определяет порядок для 'for-each', как вы хотите. В XSLT 2.0 вы можете использовать запятый оператор ',', как в 'select =" items/item [@ name = '2'], items/item [@ name = '1'] "', но XSLT 1.0 не использует иметь этот оператор. –

ответ

2

Вы можете использовать <xsl:sort> указать заказ особенно когда есть конкретная логика для определения заказа, например, по заказу name значения атрибута в порядке убывания:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:for-each select="items/item[@name='2' or @name='1']"> 
      <xsl:sort select="@name" data-type="number" order="descending"/> 
      <p>hi</p> 
      <xsl:value-of select="."/> 
     </xsl:for-each> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

xsltransform demo 1

"Я думаю, используя xsl: apply-templ Атес может быть путь, но я не могу заставить его работать даже с помощью этого простого примера»

Это также возможно, например:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:apply-templates select="items/item[@name='2']"/> 
     <xsl:apply-templates select="items/item[@name='1']"/> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="items/item"> 
     <p>hi</p> 
     <xsl:value-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 

xsltransform demo 2

выход:

<html> 
    <body> 
     <p>hi</p> 
     second 

     <p>hi</p> 
     first 

    </body> 
</html> 
+0

xsl: apply-templates - лучшее решение для меня (сортировка не потому, что порядок произволен). Большинство проблем для меня были связаны с опечатками и узлами. Ссылки на xmltransform.net были фантастическими. Гораздо лучше, чем другой онлайн-инструмент xslt, который я использовал. – rkh

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