Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 将节点的内容克隆到不同的命名空间中_Html_Xslt_Namespaces - Fatal编程技术网

Html 将节点的内容克隆到不同的命名空间中

Html 将节点的内容克隆到不同的命名空间中,html,xslt,namespaces,Html,Xslt,Namespaces,在获得更多关于真实情况的知识后,我更新了我原来问题的标题和文本。我把这个症状误解为空白没有被保留,而真正发生的是HTML元素没有被解释为HTML 我正在编写一个从WADL文档到HTML的转换。我需要在保留空白的同时克隆WADL元素的内容,因为元素可能包含类似的HTML元素,这些元素在将命名空间更改为HTML时关心空白 <doc xml:lang="en" title="Some Representation"> Sample representation: <p

在获得更多关于真实情况的知识后,我更新了我原来问题的标题和文本。我把这个症状误解为空白没有被保留,而真正发生的是HTML元素没有被解释为HTML

我正在编写一个从WADL文档到HTML的转换。我需要在保留空白的同时克隆WADL
元素的内容,因为
元素可能包含类似
的HTML元素,这些元素在将命名空间更改为HTML时关心空白

<doc xml:lang="en" title="Some Representation">
    Sample representation:
    <pre><![CDATA[
        <MyRoot>
            <MyChild awesome="yes"/>
        </MyRoot>
    ]]></pre>
</doc>
示例WADL
元素:

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

样本表示:
<?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.
        </pre>
    </doc>
</application>
]]>
以下是我目前如何改变这一点:

<?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>

...

我所看到的是,复制的
元素的内容中的空格已折叠,但没有被解释为
元素,因此表示示例看起来不正常。在复制
元素的内容时,如何指示XSL输出保留空白覆盖命名空间?或者这仅仅是我选择
元素内容的方式的问题

<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()"/>
   </pre>
 </xsl:template>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>
<doc xml:lang="en" title="Some Representation"
  xmlns="some:wadl-namespace"
>
    Sample representation:
    <pre><![CDATA[
        <MyRoot>
            <MyChild awesome="yes"/>
        </MyRoot>
    ]]></pre>
</doc>
更新 在勾选这可能是输出名称空间问题后,我创建了以下最小设置进行实验:

XML:

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

这是一个HTML段落

<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>
还有这个 是一个 预定义格式 一块 文本。
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.   
        </pre>   
    </doc>   
</application>   

文档测试
当我检查Firefox上
元素的DOM节点时,元素的名称空间指向WADL名称空间,它们不能正确地呈现为HTML(它们看起来像纯文本)。当我在Chrome上执行相同操作时,名称空间是XHTML,元素呈现为正确的XHTML元素

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

因此,我想,因为在我的原始WADL文档的
元素中,我没有显式地使用名称空间前缀,所以我需要找到一种很好的方法来强制
的内容使用XHTML名称空间,或者简单地向
的内容添加一个XHTML名称空间前缀(更多的工作,但似乎是正确的方法).

我无法使用提供的XSLT代码重新解决问题

我稍微修改了它,添加了
wadl:
名称空间:


当此转换应用于此XML文档时


样本表示:
<?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.
        </pre>
    </doc>
</application>
]]>
结果是用所需的空白生成的

一些表示法

样本表示:
<?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.
        </pre>
    </doc>
</application>
我的根 MyChild awesome=“是”/ /我的根

我怀疑您的浏览器在自定义名称空间中时可能无法正确解释
(即不介意)

请注意我的转换中的名称空间剥离。如果仅名称空间剥离无法在浏览器中产生所需的结果,则需要使用


说明。

当我运行此样式表时,以下是Dimitre的回答:


文档测试
使用更新输入文档:


这是一个HTML段落

<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>
还有这个 是一个 预先格式化 一块 文本。
我在Firefox 3.5.9上得到了这个输出(来自“检查元素”选项):

Doc测试
这是一个HTML段落

<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>
还有这个 是一个 预定义格式 一块 文本。
注意:在Firefox中,如果您的转换没有输出正确的HTML或XHTML,它将在
transformix
元素中输出。但这似乎与保留的空白没有关系(至少在这个版本中是这样)


Edit
pre/@id
属于我为“@*”模板测试的其他输入。抱歉

我在多个浏览器上测试了这个问题,似乎只有Firefox有这个问题。在IE、Chrome、Safari和Opera上,一切正常。是的,可能是Firefox对复制过来的HTML元素的自定义/缺失名称空间很敏感。当我使用Firebug查看DOM时,
元素看起来是灰色的。我将看看是否可以修复名称空间问题。我已经根据自己的设置创建了一个最小的设置来重新创建该问题。现在,我将开始应用您在回答中使用的一些技术,直到我解决名称空间问题。谢谢!现在我脑子里什么都清楚了。我将更改WADL文档,在
元素中显式使用XHTML名称空间前缀,或者应用名称空间剥离技术,将XHTML名称空间强制应用于
内容。顺便说一句
排除结果前缀=“WADL”
对Firefox没有帮助。我使用了一个模板来复制
内容,并使用
覆盖名称空间,从而解决了我的问题。感谢你在正确的方向上的大力推动+谢谢亚历杭德罗!我还应用了相同的名称空间替换,这解决了我的问题。不过,您的实现看起来比我的更简洁。谢谢我仍然保留Dimitre的答案作为公认的答案,因为在他给出答案后,我自己解决了问题。@Ates Goral:我很高兴您发现这个Firefox测试用例很有帮助。这就是重点。