Клонировать содержимое узла в другое пространство имен - PullRequest
0 голосов
/ 29 июня 2010

Я обновил название и текст моего первоначального вопроса после того, как получил больше знаний о том, что на самом деле происходит. Я неверно истолковал этот симптом, поскольку пробелы не сохранялись, в то время как на самом деле происходило то, что элементы 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> (больше работы, но, кажется, это правильный путь).

Ответы [ 2 ]

1 голос
/ 30 июня 2010

После ответа Димитра, когда я запускаю эту таблицу стилей:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wadl="http://wadl.dev.java.net/2009/02"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="wadl">
<xsl:output method="xml" omit-xml-declaration="yes"
    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/node()"/>
</body>
</html>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="{name()}" namespace="http://www.w3.org/1999/xhtml">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*">
    <xsl:copy/>
</xsl:template>

</xsl:stylesheet>

С вашим входным документом обновления:

<code><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.   
        

Iполучить этот вывод в Firefox 3.5.9 (из опции «Проверка элемента»):

<code><html><head><title>Doc Test</title></head><body>
        <p>This is an HTML paragraph</p>
        <pre>
And this
is a
preformatted
block of
text.
        

Примечание : в Firefox, еслиВаше преобразование не вывело правильный HTML или XHTML, оно будет выведено внутри элемента transformix.Но это, похоже, не имеет отношения к сохраненным пробелам (по крайней мере, в этой версии).

Редактировать : pre/@id относится к другому входу, который я протестировал для шаблона '@ *'.Извините

1 голос
/ 30 июня 2010

Я не могу воспроизвести проблему, используя предоставленный код XSLT .

Я немного изменил его, добавив пространство имен wadl::

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

 <xsl:template match="/">
  <xsl:apply-templates select="wadl:doc"/>
 </xsl:template>

 <xsl:template match="wadl:doc">
    <xsl:if test="@title">
        <p><strong><xsl:value-of select="@title"/></strong></p>
    </xsl:if>
    <p><xsl:apply-templates select="node()"/></p>
 </xsl:template>

 <xsl:template match="wadl:pre">
   <pre>
     <xsl:apply-templates select="node()"/>
   

когда это преобразование применяется к этому документу XML :

<code><doc xml:lang="en" title="Some Representation"
  xmlns="some:wadl-namespace"
>
    Sample representation:
    <pre><![CDATA[
        <MyRoot>
            <MyChild awesome="yes"/>
        </MyRoot>
    ]]>

результат полученс требуемым пробелом :

<code><p><strong>Some Representation</strong></p>
<p>
    Sample representation:
    <pre>
        &lt;MyRoot&gt;
            &lt;MyChild awesome="yes"/&gt;
        &lt;/MyRoot&gt;
    

Я подозреваю, что ваш браузер может неправильно интерпретировать <pre>, когда он находится в пользовательском пространстве имен (IE неимейте это в виду).

Обратите внимание, что в моем преобразовании убирается пространство имен. Если одно только удаление пространства имен не дает желаемых результатов в вашем браузере, вам нужно будет создать <pre> (илюбые другие html-теги, скопированные из исходного XML-документа) в пространство имен (X) Html с помощью инструкции

<xsl:element name="{name()}" namespace="http://www.w3.org/1999/xhtml">

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...