Грубо угадывая, чего вы пытаетесь достичь, вот несколько комментариев:
Зацикливание элементов в XSLT, скорее всего, является типичным подходом для начинающих для обработки тегов XML.В XML вы должны изменить свое мышление.Это означает не зацикливание тегов, а применение шаблонов, которые соответствуют определенному пути (xpath).
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" indent="yes" />
<xsl:template match="catalog">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<ul>
<xsl:apply-templates />
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="catalog/*">
<li>
<xsl:value-of select="title"/>
</li>
</xsl:template>
</xsl:stylesheet>
Я добавил простой пример и приведу некоторые пояснения:
- Ваш корневой тегОн называется
catalog
, поэтому процессор xslt говорит: «Круто, мы идем» и начинает применять шаблон, который подходит -> catalog
. - Затем in записывает эти примеры html-тегов, пока не встретит
apply-templates
. - Он ищет шаблон
cd0
, cd1
и в конечном итоге находит шаблон, который подходит всем дочерним узлам (*) каталога.(И добавляет полные названия для полноты.) Надеюсь, это поможет вам.Не уверен, генерируете ли вы этот xml-макет, но номер не должен быть частью имени тега.Лучше:
<cd id="0">
...
</cd>
Почему это лучше?Вы можете искать легче.Здесь проверяется индекс:
<xsl:template match="cd[@id='1']">
<li>
<xsl:value-of select="title"/>
</li>
</xsl:template>
здесь проверяется год:
<xsl:template match="cd[year/.>1985]">
<li>
<xsl:value-of select="title"/>
</li>
</xsl:template>
Изучая xsl, вы наткнетесь на него, «генерируя слишком много выходных данных».Это связано с тем, что применяются шаблоны по умолчанию, которые копируют пройденные xml-теги и выводят их в ваш сгенерированный вывод.Я обычно добавляю этот пустой шаблон по умолчанию, он пишет --nothing, поэтому у вас есть полный контроль.
<xsl:template match="*">
</xsl:template>
Еще несколько советов для вас и всех, кто сталкивается: node () такой же, как *
и запутанный
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
просто означает:
Используйте этот шаблон для каждого узла атрибута (@) ИЛИ (|) каждого узла тега (* или узла ()) и скопируйте егоСам узел к выходному документу, рекурсивно применяя и таким образом повторяя исходный документ.Теги комментариев игнорируются.
Надеюсь, это даст каждому новичку возможность набраться!Это на самом деле довольно круто и очень эффективно , если вы знаете, как его использовать.