Как получить из списка теги отдельных списков, включая их содержимое?
Для решения XSLT-1.0 вы должны использовать двухэтапный подход:
- Получите предметы из раздела CDATA.
- Примените шаблоны, которые вы хотите применить.
Одна проблема состоит в том, что образец CDATA не является правильно сформированным XML. Таким образом, вы должны изменить свой входной XML (изменив последний <ul>
на </ul>
) на следующее:
<Food>
<FoodItem ID="1">
<Content><![CDATA[<ul><li>Apples</li><li>Pears</li><li>Oranges</li></ul>]]></Content>
</FoodItem>
</Food>
Для первого шага вы можете использовать это (при условии, что ваш процессор XSLT поддерживает атрибут disable-output-escaping ):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- Identity template -->
<xsl:template match="node()[not(self::text())]|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>
</xsl:stylesheet>
Теперь вы можете применить свой шаблон XSLT к выходным данным вышеуказанной таблицы стилей.
Результат этого преобразования должен быть:
<?xml version="1.0" encoding="UTF-8"?>
<Food>
<FoodItem ID="1">
<Content>
<ul>
<li>Apples</li>
<li>Pears</li>
<li>Oranges</li>
<ul>
</Content>
</FoodItem>
</Food>
Теперь вторым шагом является применение другой таблицы стилей XSLT-1.0 к этому выводу.
Поэтому примените эту вторую таблицу стилей XSLT-1.0:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/Food/FoodItem/Content/ul">
<div class="food">
<ul class="fooditems">
<xsl:apply-templates select="*" />
</ul>
</div>
</xsl:template>
<xsl:template match="li">
<li class="fooditem"><xsl:value-of select="." /></li>
</xsl:template>
</xsl:stylesheet>
Результат этого второго шага:
<div class="food">
<ul class="fooditems">
<li class="fooditem">Apples</li>
<li class="fooditem">Pears</li>
<li class="fooditem">Oranges</li>
</ul>
</div>
по желанию.
РЕШИТЬ!
В более новых версиях процессоров XSLT (3.0 и выше) вы можете (возможно) выполнить оба шага в одной таблице стилей.