2014-10-15 5 views
1

Мне нужна помощь в выяснении того, как я могу сортировать цены в приведенном ниже примере ... например, в порядке возрастания. Как вы можете видеть, что я попробовал, но это не работает ... я думаю, потому что я только получать определенные элементы, которые имеют номер версии больше или равно 1XSL Сортировка в цикле

<?xml version="1.0" encoding="ISO8859-1"?> 

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

<xsl:template match ="/"> 
     <html> 
      <head> 
       <title>Apps List</title> 
      </head> 
      <body> 
       <h1>Application List</h1> 
       <table border="1"> 
        <tr> 
         <th>Name</th> 
         <th>Type</th> 
         <th>Version</th> 
         <th>Price</th> 
        </tr> 
        <!-- for loop start--> 
        <xsl:for-each select="app/appCategory"> 
         <xsl:sort select="appType/@price" order="ascending" data-type="number" /> 
         <xsl:variable name="appType" select="@type"/> 
          <!-- for loop start--> 
          <xsl:for-each select="appItem"> 
           <!-- if statement start--> 
           <xsl:if test = "@version &#62;&#61; 1"> <!-- &#62;&#61; means >= --> 
            <tr> 
             <td><xsl:value-of select="."/></td> 
             <td><xsl:value-of select="$appType"/></td> 
             <td><xsl:value-of select="@version"/></td> 
             <td>&#xA3;<xsl:value-of select="@price"/></td> 
            </tr> 
           </xsl:if> 
          </xsl:for-each> 
        </xsl:for-each> 
       </table> 
      </body> 
     </html> 
</xsl:template> 
</xsl:stylesheet> 

Вот файл XML:

<?xml version="1.0" encoding="ISO8859-1" ?> 
<?xml-stylesheet type="text/xsl" href="q2.xsl"?> 

<app> 
    <appCategory type="Productivity"> 
     <appItem fileName="Messages" version="0.2" price="34.99">Thunderbird</appItem> 
     <appItem fileName="Contacts" version="2.0" price="3.00">Convenience Book</appItem> 
     <appItem fileName="Calendar" version="1.0" price="45.00">ForgetMilk</appItem> 
     <appItem fileName="Email" version="1.3" price="3.45">Email</appItem> 
    </appCategory> 
    <appCategory type="Games"> 
     <appItem fileName="BrickBreaker" version="7.1" price="14.99">Brick Breaker</appItem> 
     <appItem fileName="WordMole" version="4.1" price="22.99">Word Mole</appItem> 
     <appItem fileName="FistOfAwesome" version="4.1" price="3.99">Fist of Awesome</appItem>  
    </appCategory> 
    <appCategory type="Social networking"> 
     <appItem fileName="BlackBerry Messenger" version="0.2" price="0.99">Blackberry Messenger</appItem> 
     <appItem fileName="Twitter" version="1.1" price="24.99">Twitter</appItem> 
     <appItem fileName="Facebook" version="0.5" price="44.99">Facebook</appItem> 
     <appItem fileName="Grodog" version="0.5" price="1.99">Grodog</appItem> 
     <appItem fileName="LinkedIn" version="2.1" price="3.59">LinkedIn</appItem> 
     <appItem fileName="YouTube" version="5.5" price="1.59">YouTube</appItem> 
    </appCategory> 
</app> 
+0

вы должны показать нам свой источник XML, чтобы выяснить, почему это не сортировка правильно ... кстати > = такая же, как > = и несколько более читаемым. .. соответственно вы можете использовать < для ниже –

ответ

0

при использовании <xsl:for-each>, то <xsl:sort> элемент (ы), определяющий ключ сортировки для входной последовательности должны появляться в качестве первых детей для-каждого, и они относятся к элементам, выбранным окруженным для- каждый. Теперь, как ваш шаблон написан, он пытается сортировать <appCategory> элементов в ключах сортировки, которые состоят из последовательностей цен. Это, вероятно, не то, что вы хотите.

Кроме того, ваше использование «appType» сбивает с толку. Действительно ли это имя элемента в исходном документе, как кажется XSL, или это только имя переменной? Я догадываюсь о последнем.

Трудно быть уверенным в том, что вам нужно без схемы для документа, который вы трансформируете. Я собираюсь предположить, что входной документ может иметь такую ​​форму (которая более или менее подразумевается шаблон):

<app> 
    <appCategory type='type1'> 
    <appItem version='0' price='2.00'>item1</appItem> 
    <appItem version='1' price='1.00'>item1</appItem> 
    <appItem version='1' price='2.00'>item2</appItem> 
    <appItem version='2' price='2.50'>item2</appItem> 
    </appCategory> 
    <appCategory type='type2'> 
    <appItem version='57' price='200.00'>item3</appItem> 
    </appCategory> 
</app> 

В этом случае, если вы хотите отсортировать <appItem> элементов во всех категориях по цене, то вам нужно что-то больше, как это:

<!-- select all the items to be sorted and output --> 
<xsl:for-each select="app/appCategory/appItem[@version &gt;= 1]"> 
    <!-- sort key for the input sequence selected by the for-each --> 
    <xsl:sort select="@price" order="ascending" data-type="number" /> 
    <!-- sequence constructor for the transformed result --> 
    <tr> 
    <td><xsl:value-of select="."/></td> 
    <td><xsl:value-of select="../@type"/></td> 
    <td><xsl:value-of select="@version"/></td> 
    <td>&#xA3;<xsl:value-of select="@price"/></td> 
    </tr> 
</xsl:for-each> 
+0

Спасибо за лет Ур помог ему действительно помог :) – Fatih

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