Однако во время XLST тег <i>
получает
игнорируется, поэтому «Звездных войн» нет
курсив в выводе HTML. Является
там относительно простой способ исправить
это?
Ваша проблема здесь :
<ul>
<xsl:for-each select="favoriteMovies/favoriteMovie">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
Инструкция <xsl:value-of>
используется для создания текстового узла. При этом он копирует на выход строковое значение выражения XPath, указанного в атрибуте select
этой инструкции XSLT. Строковое значение элемента является объединением всех его потомков текстовых узлов.
Так вот, как вы получите отчетный результат.
Решение
Используйте инструкцию <xsl:copy-of>
, которая копирует все узлы, указанные в ее атрибуте select
:
<ul>
<xsl:for-each select="favoriteMovies/favoriteMovie">
<li><xsl:copy-of select="node()"/></li>
</xsl:for-each>
</ul>
Другое решение, более согласованное с принципами XSLT , позволяет вообще не использовать <xsl:for-each>
:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<html>
<head />
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="/*">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="favoriteMovie">
<li><xsl:copy-of select="node()"/></li>
</xsl:template>
</xsl:stylesheet>
Когда любое из двух указанных выше решений применяется к предоставленному документу XML :
<favoriteMovies>
<favoriteMovie>the
<i>Star Wars</i> saga
</favoriteMovie>
</favoriteMovies>
желаемый, правильный результат получается :
<html>
<head/>
<body>
<ul>
<li>the
<i>Star Wars</i> saga
</li>
</ul>
</body>
</html>