2010-03-09 5 views
2

Я видел этот ресурс link text, но у меня все еще возникают проблемы с созданием действительного документа XHTML с использованием анализатора MSXML.Преобразование XSLT для создания допустимого XHTML: проблема с пространством имен

У меня на входе следующий документ:

<?xml version="1.0" encoding="UTF-8" ?> 
- <html xml:lang="it" xmlns="http://www.w3.org/1999/xhtml"> 
- <head xmlns=""> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>Bla bla bla</title> 
    <link rel="stylesheet" type="text/css" media="screen" href="css/bla.css" /> 
    </head> 
- <body xmlns="" style="background-color:#DFDFDF;left-margin:0;margin-top:0"> 
    .... 
    </body> 
    </html> 

где противных XMLNS = «» производятся потому, что я вставил инструкции:

parserInstance.documentElement.setAttribute "xmlns", "http://www.w3.org/1999/xhtml" 

при создании входного документа перед преобразованием.

XSLT импортирует преобразование я использую для ловли HTML элементы

<xsl:stylesheet 
    version="1.0" 
    xmlns:xhtml="http://www.w3.org/1999/xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="xhtml xsl" 
> 
<xsl:import href="_lib.xsl"/> 
<xsl:import href="_standard.xsl"/> 

и в _standard.xsl у меня есть код, которые делают rerlevant преобразование:

<xsl:template match="html"> 
<xsl:copy> 
    <xsl:copy-of select="@*" /> 
    <xsl:apply-templates select="head" />  
    <xsl:apply-templates select="body" />  
</xsl:copy> 

Еще У меня нет требуемых xmlns в разметке html:

<html xml:lang="it"> 

И я до сих пор неприятный Xmlns intersparsed в HTML код:

<h1 xmlns="http://www.w3.org/1999/xhtml">BLA BLA</h1> 

Где я получаю неправильно?

Пожалуйста, обратите внимание: я должен использовать нагрузочную модель трансформации, я не могу использовать тождественное преобразование

ответ

3

С моделью DOM (MSXML использует) пространство имен элемента или атрибут узел определяются при его создании, вы не можете изменить его впоследствии, и попытки, подобные вашей, изменить пространство имен, установив атрибут с именем «xmlns», не меняют пространство имен узлов.

Так звучит так, как будто у вас есть входной документ с элементами без пространства имен и вы хотите использовать XSLT для преобразования его в единицу с элементами пространства имен XHTML. В этом случае вы не можете использовать xsl: copy таким образом, чтобы получить элементы результата без пространства имен. Вместо этого вам нужно, например,

<xsl:template match="html"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    ... 
    </html> 
</xsl:template> 

или, конечно, как вы хотите, что пространство имен для всех элементов результата вы могли бы положить Xmlns = «http://www.w3.org/1999/xhtml» на XSL: таблицы стилей элементы таблицы стилей или стилей модуль (ы), который вы хотите создать элементы XHTML.

+0

Выполнено, но все еще атрибуты xmlns содержатся в некоторых элементах html в выходном документе. – Daniel

+1

Опубликуйте минимальные, но полные образцы вашего XML-ввода и таблицу стилей, которые позволяют нам воспроизвести проблему, и я уверен, что мы сможем ее исправить. Я боюсь, что «есть еще атрибуты xmlns на некоторых элементах html», не позволяет мне решить, откуда они происходят, соответственно, как это исправить, мне нужно увидеть код. –

0

@Martin: Я отправляю образцы. Извините, что был обобщен в моем комментарии.

Входной документ (минимальный)

<?xml version="1.0" encoding="UTF-8"?> 
<html xml:lang="it"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 
<title>Page title</title> 
<link rel="stylesheet" type="text/css" media="screen" href="css/stile.css"/> 
</head> 
<body> 
<div id="errorPanel" class="errorPanel"/> 
<navigation> 

<panel name="navbar"> 
<link> 
<url>resource1.htm</url> 
<label>resource1</label> 
</link> 
</panel> 

<panel name="special"> 
<link> 
<url>resource2.htm</url> 
<label>resource2</label> 
</link> 
</panel> 
</navigation> 

<content/> 

<script type="text/javascript" src="lib/jquery.js"/> 
<script type="text/javascript" src="backend.js"/> 

</body> 
</html> 

Тогда главный XSL только для содержания:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml" 
    exclude-result-prefixes="xsl" 
> 
<xsl:import href="_lib.xsl"/> 
<xsl:import href="_standard.xsl"/> 
<xsl:output 
    method="xml" 
    omit-xml-declaration="no" 
    encoding="UTF-8" 
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" 
/> 

<xsl:template match="content"> 
      <h1>CONTENT</h1> 
      <p> 
       Bla bla bla 
      </p>  
</xsl:template> 
</xsl:stylesheet> 

Тогда _standard.xsl.Обратите внимание, что инструкции:

<xsl:template match="html"> 

используется временно, то XSL-копия была использована как в первом фрагменте кода размещена

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

<xsl:template match="html"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates select="head" />  
     <xsl:apply-templates select="body" />  
    </html> 
</xsl:template> 

<xsl:template match="head"> 
     <xsl:copy-of select="." /> 
</xsl:template> 

<xsl:template match="body"> 
    <body> 
    <table id='toppanel'> 
     <tr> 
      <td>Bla bla bla</td> 
      <td>Bla bla bla</td> 
      <td>Bla bla bla</td> 
     </tr> 
    </table> 

    <table> 
    <tr> 
     <xsl:apply-templates select="navigation/panel[@name='navbar']" mode="td"/> 
    </tr> 
    </table> 

    <table> 
    <tr> 
     <td> 
       <p>Area</p> 
       <xsl:apply-templates select="navigation/panel[@name='special']" /> 
     </td> 

     <td> 
      <xsl:apply-templates select="content" /> 
     </td> 

    </tr> 
    </table> 
    </body> 
</xsl:template> 

</xsl:stylesheet> 

Я нашел в выходном разметке так:

<body xmlns=""> 

Надеюсь ясно.

1

Если вы помещаете xmlns = "http://www.w3.org/1999/xhtml" в элемент 'html', то он применяется к этому элементу и всем его (не квалифицированным) элементам потомков. Элемент «body» находится в совершенно другом шаблоне, поэтому вам нужно либо поместить объявление пространства имен в элемент body, либо, как уже было предложено, вы просто ставите xmlns = «http://www.w3.org/1999/xhtml «на всех элементах xsl: stylesheet ваших модулей стилей, которые должны создавать элементы XHTML.

А также не делать или создавать копию входного узла. Поскольку ваши элементы ввода не имеют пространства имен, если вы копируете любой из них, копия в результате также не будет содержать пространства имен, пока вы хотите, чтобы элементы результата находились в пространстве имен XHTML. Таким образом, выполнение xsl: copy или xsl: copy-of не будет работать для того, что вы хотите, вместо этого вам нужно запустить свои элементы через шаблон, который изменяет пространство имен, например.

<xsl:template match=*"> 
    <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml"> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
Смежные вопросы