2015-11-21 4 views
0

Я хотел бы извлечь записи из файла XML с элементами каталога, которые имеют дочерний элемент года. Я должен извлечь элементы, которые находятся между заданным периодом времени, но я не могу найти способ сделать это. Я попытался с помощью if's и затем, но не смог найти правильный способ сделать это. Вот мой код, пожалуйста, дайте мне несколько советов.Почему этот XSLT не работает?

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

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>Bibliography entries</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Type</th> 
     <th>Year</th> 
     </tr> 
     <xsl:for-each select="catalog/cd"> 
     <xsl:when test="(year > 2000) and (year < 2005)"> 
     <tr> 
     <td><xsl:value-of select="title"/></td> 
     <td><xsl:value-of select="type"/></td> 
     <td><xsl:value-of select="year"/></td> 
     </tr> 
     </xsl:when> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

ответ

1

Есть две вещи, чтобы отметить в вашем XSLT

  1. xsl:when должен быть внутри xsl:choose
  2. Оператор < должен быть экранированы, как &lt; внутри выражения.

Таким образом, вы ток XSLT должен выглядеть следующим образом:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>Bibliography entries</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Type</th> 
     <th>Year</th> 
     </tr> 
     <xsl:for-each select="catalog/cd"> 
     <xsl:choose> 
     <xsl:when test="(year > 2000) and (year &lt; 2005)"> 
     <tr> 
     <td><xsl:value-of select="title"/></td> 
     <td><xsl:value-of select="type"/></td> 
     <td><xsl:value-of select="year"/></td> 
     </tr> 
     </xsl:when> 
     </xsl:choose> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

Обратите внимание, что если вы не будете иметь несколько тестов, и принимать различные действия для каждого теста, вы можете поместить свое тестовое выражение в выберите оператор.

Это означает, что ваш XSLT также может выглядеть следующим образом:

<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>Bibliography entries</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Title</th> 
     <th>Type</th> 
     <th>Year</th> 
     </tr> 
     <xsl:for-each select="catalog/cd[year > 2000 and year &lt; 2005]"> 
     <tr> 
     <td><xsl:value-of select="title"/></td> 
     <td><xsl:value-of select="type"/></td> 
     <td><xsl:value-of select="year"/></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+0

спасибо так много, это работает. Я пробовал что-то подобное, но это не сработало, кулон, пожалуйста, объясните мне почему? Спасибо . Это то, что я пробовал, но это не сработало. user3671805

+0

Вам нужно избежать' '' '' '' < 'внутри вашего выражения;' ' –

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