Как XSLT-преобразовать XHTML-документ с IE-условными комментариями? - PullRequest
2 голосов
/ 23 октября 2011

Я преобразую документ XHTML в другой документ XML с помощью XSLT. В XHTML-Input-Dokument есть несколько IE-условных комментариев, как этот:

<!--[if lte IE 7]>
<link rel='stylesheet' href='ie.css' type='text/css' />
<![endif]-->

Но во время трансформации они теряются ... Даже если я попытаюсь сделать только личную копию:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" />

    <xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Я получаю только элемент link без условного комментария вокруг него.

Как скопировать XHTML-документ с условным комментарием?

1 Ответ

2 голосов
/ 23 октября 2011

Даже если я попытаюсь сделать только личную копию:

...

Я только получаю link-элемент без условного комментария вокруг него.

Если это правда, в чем я сомневаюсь, значит, вы используете очень глючный XSLT-процессор . Ни один совместимый XSLT-процессор не удалит комментарий и выдаст текст комментария - без соответствующих инструкций XSLT (в пределах шаблона, соответствующего comment()).

Конечно, я не смог воспроизвести эту «проблему» , попробовав 6-7 различных процессоров XSLT с этим преобразованием:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

При применении к этому документу XML (комментарий, завернутый в один верхний элемент, чтобы стать правильно сформированным документом XML):

<html>
<!--[if lte IE 7]> <link rel='stylesheet' href='ie.css' type='text/css' /> <![endif]-->
</html>

результат точно такой же XML-документ :

<html>
  <!--[if lte IE 7]> <link rel='stylesheet' href='ie.css' type='text/css' /> <![endif]-->
</html>

Сказав это, сгенерировать такой «комментарий» немного сложнее - вот демонстрация, как это сделать:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <html>
       <xsl:text disable-output-escaping="yes">&#xA;&lt;!--[if lte IE 7]> </xsl:text>
       <link rel='stylesheet' href='ie.css' type='text/css' />
       <xsl:text disable-output-escaping="yes"> &lt;![endif]-->&#xA;</xsl:text>
     </html>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к любому XML-документу (в нашем примере это не используется), получается требуемый правильный вывод :

<html>
<!--[if lte IE 7]> <link rel="stylesheet" href="ie.css" type="text/css"/> <![endif]-->
</html>
...