Iv'e получил XML-файл, содержащий данные об играх, которые загружаются в формате .exe; название игры; расположение изображения и альтернативный текст для использования. Который сортируется по категориям. (См. Ниже)
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="games.xsl"?>
<all>
<general>
<catagory_name>
<catg_1>Action</catg_1>
<catg_2>Other</catg_2>
</catagory_name>
</general>
<games>
<catagory name='Action'>
<game>
<name>1945<!--name--></name>
<url><!--URL to game download--></url>
<image><!--image location--></image>
<alt>1945 Icon<!--alt text for image--></alt>
</game>
</catagory>
<catagory name='Other'>
<game>
<name>Platform Game<!--name--></name>
<url><!--URL to game download--></url>
<image><!--image location--></image>
<alt>Platform Game Icon<!--alt text for image--></alt>
</game>
</catagory>
</games>
</all>
Затем я получил этот xslt-файл для преобразования xml в xhtml ...
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/all">
<html>
<body>
<h1 style="text-align:center;">Games</h1>
<center>
<table>
<xsl:if test="//general/catagory_name/catg_1">
<xsl:variable name="catg">
<xsl:value-of select="//general/catagory_name/catg_1"/>
</xsl:variable>
<xsl:if test="//games/catagory[@name=$catg]/game[position() = (1)]/url">
<tr>
<td colspan="4" rowspan="1">
<h2>
<xsl:copy-of select="$catg"/>
</h2>
</td>
</tr>
<xsl:for-each select="//games/catagory[@name=$catg]/game[position() mod 4 = 1]">
<xsl:variable name="pos" select="position() * 4"/>
<tr>
<xsl:if test="//games/catagory[@name=$catg]/game[position() = ($pos - 3)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 3)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 3)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 3)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg]/game[position() = ($pos - 2)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 2)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 2)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 2)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg]/game[position() = ($pos - 1)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 1)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 1)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 1)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg]/game[position() = ($pos)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
</tr>
<tr>
<xsl:if test="//games/catagory[@name=$catg]/game[position() = ($pos - 3)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 3)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg]/game[position() = ($pos -3)]/name"/>
</p>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg]/game[position() = ($pos - 2)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 2)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg]/game[position() = ($pos -2)]/name"/>
</p>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg]/game[position() = ($pos - 1)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos - 1)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg]/game[position() = ($pos -1)]/name"/>
</p>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg]/game[position() = ($pos)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg]/game[position() = ($pos)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg]/game[position() = ($pos)]/name"/>
</p>
</a>
</td>
</xsl:if>
</tr>
</xsl:for-each>
</xsl:if>
</xsl:if>
<xsl:if test="//general/catagory_name/catg_2">
<xsl:variable name="catg2">
<xsl:value-of select="//general/catagory_name/catg_2"/>
</xsl:variable>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = (1)]/url">
<tr>
<td colspan="4" rowspan="1">
<h2>
<xsl:copy-of select="$catg2"/>
</h2>
</td>
</tr>
<xsl:for-each select="//games/catagory[@name=$catg2]/game[position() mod 4 = 1]">
<xsl:variable name="pos" select="position() * 4"/>
<tr>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
</tr>
<tr>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg2]/game[position() = ($pos -3)]/name"/>
</p>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg2]/game[position() = ($pos -2)]/name"/>
</p>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg2]/game[position() = ($pos -1)]/name"/>
</p>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg2]/game[position() = ($pos)]/name"/>
</p>
</a>
</td>
</xsl:if>
</tr>
</xsl:for-each>
</xsl:if>
</xsl:if>
</table>
</center>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Этот код работает абсолютно нормально, однако он уже довольно сложен. Сначала он проверяет, существует ли конкретная категория, а затем есть ли в этой категории какие-либо игры. Затем он отображает это, но только если данные существуют. Так что вы будете рады, что все в порядке. Моя проблема в том, что каждый раз, когда я хочу добавить новую категорию, я должен зайти в файл xslt и добавить код ниже с переменной $ catg, называемой $ catg1, $ catg2 и так далее, для всех катагорий, которые мне нужны, потому что вы можете не изменять значение существующей переменной.
<xsl:if test="//general/catagory_name/catg_2">
<xsl:variable name="catg2">
<xsl:value-of select="//general/catagory_name/catg_2"/>
</xsl:variable>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = (1)]/url">
<tr>
<td colspan="4" rowspan="1">
<h2>
<xsl:copy-of select="$catg2"/>
</h2>
</td>
</tr>
<xsl:for-each select="//games/catagory[@name=$catg2]/game[position() mod 4 = 1]">
<xsl:variable name="pos" select="position() * 4"/>
<tr>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos)]/url)"/>
</xsl:attribute>
<img>
<xsl:attribute name="src">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos)]/image)"/>
</xsl:attribute>
<xsl:attribute name="alt">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos)]/alt)"/>
</xsl:attribute>
</img>
</a>
</td>
</xsl:if>
</tr>
<tr>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 3)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg2]/game[position() = ($pos -3)]/name"/>
</p>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 2)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg2]/game[position() = ($pos -2)]/name"/>
</p>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos - 1)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg2]/game[position() = ($pos -1)]/name"/>
</p>
</a>
</td>
</xsl:if>
<xsl:if test="//games/catagory[@name=$catg2]/game[position() = ($pos)]/url">
<td>
<a>
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(//games/catagory[@name=$catg2]/game[position() = ($pos)]/url)"/>
</xsl:attribute>
<p>
<xsl:value-of select="//games/catagory[@name=$catg2]/game[position() = ($pos)]/name"/>
</p>
</a>
</td>
</xsl:if>
</tr>
</xsl:for-each>
</xsl:if>
</xsl:if>
Что я хочу сделать, так это уметь использовать для каждого из них, поэтому нужно иметь только один код (см. Выше), настолько сложный, который никогда не нуждается в изменении для новой категории. Итак, мой вопрос, как бы я это сделал? Я пробовал с переменными ect, но вам все равно придется редактировать код каждый раз, когда вы хотите новую категорию, потому что вы не можете изменить значение существующей переменной.
Единственное решение, которое я могу придумать, это заменить $ catg значением узла, которое он представляет, то есть general / catagory_name / catg, и зацикливать его каждый раз, но я не добился успеха.