代码之家  ›  专栏  ›  技术社区  ›  Ates Goral

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

  •  0
  • Ates Goral  · 技术社区  · 15 年前

    我已经更新了我最初问题的标题和文本,在获得了更多关于真实情况的知识之后。我错误地将这种症状解释为空白不被保留,而真正发生的是HTML元素没有被解释为HTML。

    我正在写一个从wadl文档到html的转换。我需要复制wadl的内容 <doc> 元素 同时保留空白,因为 <博士学位; 元素可以包含HTML元素,例如 <pre> 关心空白区 将命名空间更改为HTML时。

    样品WADL <博士学位; 元素:

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

    以下是我目前的转型方式:

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

    我看到的是 <预科; 要素 空白区折叠了吗 不被解释为 <预科; 元素,因此表示示例看起来异常。如何指示XSL输出 保留空白 在复制的内容时重写命名空间 <博士学位; 元素?或者这只是我选择 <博士学位; 元素?

    更新

    在勾选了这可能是一个输出名称空间问题之后,我创建了以下最小设置进行实验:

    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>
    

    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>
    

    当我检查 <p> <预科; 元素在firefox上,元素的名称空间指向wadl名称空间,它们不能正确地呈现为HTML(它们看起来像纯文本)。当我在chrome上做同样的操作时,名称空间是xhtml,元素呈现为适当的xhtml元素。

    所以,我想,自从 <博士学位; 我的原始wadl文档的元素我没有显式地使用名称空间前缀,我需要找到一种强制 <博士学位; 要使用XHTML名称空间,或只需向的内容添加XHTML名称空间前缀。 <博士学位; (更多的工作,但似乎是正确的方式)。

    2 回复  |  直到 13 年前
        1
  •  1
  •   Dimitre Novatchev    15 年前

    我无法使用提供的xslt代码重新设置问题 .

    我稍微修改了一下,增加了 wadl: 命名空间:

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

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

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

    结果是用所需的空白产生的。 :

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

    我怀疑你的浏览器可能无法正确解释 <pre> 当它在自定义命名空间中时(即不介意)。

    注意转换中的名称空间剥离。 如果仅剥离名称空间不能在浏览器中生成所需的结果,则需要创建 <预科; (以及从源XML文档复制的任何其他HTML标记)在(x)HTML命名空间中,通过使用

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

    指令。

        2
  •  1
  •   user357812    15 年前

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

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

    使用更新输入文档:

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

    我在火狐3.5.9上得到这个输出(来自“inspect element”选项):

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

    注释 :在火狐中,如果转换没有输出正确的HTML或XHTML,它将在 transformix 元素。但这似乎与保留的空白(至少在这个版本中)没有关系。

    编辑 : pre/@id 属于我为“@*”模板测试过的其他输入。对不起的

    推荐文章