Я обновил название и текст моего первоначального вопроса после того, как получил больше знаний о том, что на самом деле происходит. Я неверно истолковал этот симптом, поскольку пробелы не сохранялись, в то время как на самом деле происходило то, что элементы HTML не интерпретировались как HTML.
Я пишу преобразование из документа WADL в HTML. Мне нужно клонировать содержимое элементов WADL <doc>
при сохранении пробелов, поскольку элементы <doc>
могут содержать элементы HTML, такие как <pre>
, которые заботятся о пробелах , при изменении пространства имен на HTML.
Пример элемента WADL <doc>
:
<code><doc xml:lang="en" title="Some Representation">
Sample representation:
<pre><![CDATA[
<MyRoot>
<MyChild awesome="yes"/>
</MyRoot>
]]>
Вот как я сейчас преобразую это:
<xsl:apply-templates select="wadl:doc"/>
...
<xsl:template match="wadl:doc">
<xsl:if test="@title">
<p><strong><xsl:value-of select="@title"/></strong></p>
</xsl:if>
<p><xsl:copy-of select="*|node()"/></p>
</xsl:template>
Что я вижу, так это то, что содержимое скопированного элемента <pre>
имеет пробел, свернутый не интерпретируется как элемент <pre>
, и, следовательно, образец представления выглядит неправильно. Как я могу дать XSL-выводу сохранить пробел переопределить пространство имен при копировании содержимого элементов <doc>
? Или это просто проблема с тем, как я выбираю содержимое элементов <doc>
?
Обновление
После того, как отметили, что это может быть проблемой выходного пространства имен, я создал следующую минимальную настройку для эксперимента:
XML:
<code><?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="doc_test.xsl"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
<doc>
<p>This is an HTML paragraph</p>
<pre>
And this
is a
preformatted
block of
text.
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wadl="http://wadl.dev.java.net/2009/02">
<xsl:output
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<xsl:template match="wadl:application">
<html>
<head>
<title>Doc Test</title>
</head>
<body>
<xsl:apply-templates select="wadl:doc"/>
</body>
</html>
</xsl:template>
<xsl:template match="wadl:doc">
<xsl:copy-of select="node()"/>
</xsl:template>
</xsl:stylesheet>
Когда я проверяю узел DOM элементов <p>
или <pre>
в Firefox, пространство имен элементов указывает на пространство имен WADL, и они не отображаются должным образом в виде HTML (они выглядят как обычный текст) , Когда я делаю то же самое в Chrome, пространство имен - это XHTML, и элементы отображаются как правильные элементы XHTML.
Итак, я думаю, поскольку в элементах <doc>
моего исходного документа WADL я не использую префиксы пространств имен явно, мне нужно найти хороший способ заставить содержимое <doc>
использовать пространство имен XHTML, или просто добавьте префикс пространства имен XHTML к содержимому <doc>
(больше работы, но, кажется, это правильный путь).