结果文档中生成空/空白命名空间声明

2024-01-01

我编写了一个用于将 XML 转换为 ePub 的包。一切正常,除了某些情况下,空白命名空间(xmlns="") 节点被写入结果文档。在转换之前,我准备了临时变量来保存主要段(即,meta, body等),最后复制节点(使用xsl:copy-of[@copy-namespaces='no']指令)到结果文档。我也用过@exclude-result-prefixes='ns_list_sep_by_space' within xsl:transform元素,但仍然无法得到想要的结果。

oXygen IDE 在弹出窗口中显示一条消息:

使用 xsl:copy-of 时,新元素还将具有从原始元素节点复制的命名空间节点,除非通过指定 copy-namespaces="no" 来排除它们。如果省略此属性,或取值 yes,则原始元素的所有命名空间节点都将复制到新元素。如果它的值为 no,则不会复制任何命名空间节点:但是,命名空间节点仍将按照命名空间修复过程的要求在结果树中创建。


这是我的问题的更多详细信息:

主要样式表:
main.xsl:main caller

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    xmlns:cylian="local-ns-for-extension-functions"
    exclude-result-prefixes="xs xd cylian"
    version="2.0">

    <xsl:import href="modules/core.xsl"/>

    <xsl:variable name="base" select="base-uri()" as="xs:anyURI"/>

    <xsl:template match="/">
        <xsl:call-template name="procA"/>
    </xsl:template>

</xsl:transform>

主要样式表:
core.xsl: core processing unit

<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
        xmlns:cylian="local-ns-for-extension-functions"
        exclude-result-prefixes="xs xd cylian"
        version="2.0">

      <xsl:import href="sub1.xsl"/>  
      <xsl:import href="sub2.xsl"/>  
      <!--and more-->  

      <!-- variable to hold intermediate results for stage1 -->
      <xsl:variable name="stage1">
          <cylianz>
              <xsl:copy-of select="$a" copy-namespaces="no"/>
              <xsl:copy-of select="$b" copy-namespaces="no"/>
              <!--and more-->
          </cylianz>
      </xsl:variable>

      <!-- variable to hold intermediate results for stage2 -->
      <xsl:variable name="stage2">
          <cylianz>
            <xsl:for-each select="$stage1//cylian">
                <xsl:sort select="@pos"/>
                <xsl:sequence select="."/>
            </xsl:for-each>
          </cylianz>
      </xsl:variable>
      <xsl:template name="procA">
          <xsl:for-each select="$stage2//cylian">
              <xsl:result-document href="{concat($outdir,@href)}" format="general">
                  <xsl:call-template name="procB">
                        <xsl:with-param name="context" select="."/>
                        <xsl:with-param name="title">
                            <xsl:value-of select="$book_title"/>
                        </xsl:with-param>
                   </xsl:call-template>
              </xsl:result-document>
          </xsl:for-each>
      </xsl:template>
     <xsl:template name="procB">
         <xsl:param name="context"/>
         <xsl:param name="title"/>
         <html xmlns="http://www.w3.org/1999/xhtml">
         <head>
              <xsl:call-template name="header">
                  <xsl:with-param name="title" select="$title"/>
               </xsl:call-template>
         </head>
         <body>
              <div id="root">
                  <xsl:apply-templates select="."/>
              </div>
         </body>
    </html>
</xsl:template>

<!--
 1/ other rules are shortened for clarity
 2/ declaration «xmlns:cylian='local-ns-for-extension-functions'» has to retain, some parts of transformation uses some extension functions from that namespace
-->

</xsl:transform>

这是输出:a.html

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
  PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <meta xmlns="" http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      <title xmlns="">BookTitle</title>
          <!--
              2012.04.16 - 18:27:36 [XSLT processor: SAXON 9.1.0.5 from Saxonica]
          -->
      <link xmlns="" href="isbn.css" type="text/css" rel="stylesheet"/>
   </head>
   <body>
      <div id="root">
         <div xmlns="" id="a1">
            <!--...-->
         </div>
      </div>
   </body>
</html>

我希望它会更容易理解发生了什么问题。欢迎所有建议。提前致谢。


好吧,我们需要查看您的代码才能确定,但​​我怀疑您有例如

<xsl:template match="/">
  <foo xmlns="http://example.com/ns">
    <xsl:apply-templates/>
  </foo>
</xsl:template>

<xsl:template match="whatever">
  <bar/>
</xsl:template>

然后你得到

<foo xmlns="http://example.com/ns">
  <bar xmlns=""/>
</foo>

当你想要的时候

<foo xmlns="http://example.com/ns">
  <bar/>
</foo>

要解决此问题,请确保使用以下命令移动 xsl:stylesheet 元素上的默认名称空间声明:

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

    <xsl:template match="/">
      <foo>
        <xsl:apply-templates/>
      </foo>
    </xsl:template>

    <xsl:template match="whatever">
      <bar/>
    </xsl:template>

</xsl:stylesheet>

这样它就适用于在不同模板中创建的所有结果元素。

[编辑] 根据您现在提供的示例,我认为我的建议是正确的,只需使用几个文件即可确保您放置的所有样式表模块xmlns="http://www.w3.org/1999/xhtml" on the xsl:stylesheet分别xsl:transform元素,以便所有结果元素最终都位于 XHTML 命名空间中。

[第二次编辑] 我想你想要

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns="http://www.w3.org/1999/xhtml"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
        xmlns:cylian="local-ns-for-extension-functions"
        exclude-result-prefixes="xs xd cylian"
        version="2.0">

      <xsl:import href="sub1.xsl"/>  
      <xsl:import href="sub2.xsl"/>  
      <!--and more-->  

      <!-- variable to hold intermediate results for stage1 -->
      <xsl:variable name="stage1" xmlns="">
          <cylianz>
              <xsl:copy-of select="$a" copy-namespaces="no"/>
              <xsl:copy-of select="$b" copy-namespaces="no"/>
              <!--and more-->
          </cylianz>
      </xsl:variable>

      <!-- variable to hold intermediate results for stage2 -->
      <xsl:variable name="stage2" xmlns="">
          <cylianz>
            <xsl:for-each select="$stage1//cylian">
                <xsl:sort select="@pos"/>
                <xsl:sequence select="."/>
            </xsl:for-each>
          </cylianz>
      </xsl:variable>
      <xsl:template name="procA">
          <xsl:for-each select="$stage2//cylian">
              <xsl:result-document href="{concat($outdir,@href)}" format="general">
                  <xsl:call-template name="procB">
                        <xsl:with-param name="context" select="."/>
                        <xsl:with-param name="title">
                            <xsl:value-of select="$book_title"/>
                        </xsl:with-param>
                   </xsl:call-template>
              </xsl:result-document>
          </xsl:for-each>
      </xsl:template>
     <xsl:template name="procB">
         <xsl:param name="context"/>
         <xsl:param name="title"/>
         <html >
         <head>
              <xsl:call-template name="header">
                  <xsl:with-param name="title" select="$title"/>
               </xsl:call-template>
         </head>
         <body>
              <div id="root">
                  <xsl:apply-templates select="."/>
              </div>
         </body>
    </html>
</xsl:template>


</xsl:transform>

然后,如果您有任何其他模块应该生成 XHTML 元素,请确保将xmlns="http://www.w3.org/1999/xhtml"在模块的根元素上,或者如果您还需要在其他名称空间中创建元素,则在任何应该输出 XHTML 的模板上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结果文档中生成空/空白命名空间声明 的相关文章

随机推荐

  • XmlTextReader with SslStream - 从流中读取多个 xml

    我有一个 SslStream 我从中接收自发的 XML 消息 我想使用 XmlTextReader 处理来自该流的 XML 消息 不幸的是 它只允许我读取第一个 XML 当我在收到第一个 xml 后调用 Read 时 该方法会抛出异常 XM
  • React/React Context API:使用 useEffect() 钩子时等待上下文值

    我正在使用 React 开发一个网络应用程序 这就是我想要做的 在最高阶组件中 检查用户是否登录 如果登录 则更新 userinfo Context 值 在 Profile js 中 获取 userinfo 上下文值 检查userinfo是
  • Resteasy 错误响应主体无法访问

    我正在使用 Quarkus 框架和 RestEasy 进行 REST 通信 当响应代码为 200 等时 一切正常 当客户端收到错误代码时 例如400 Bad Request Resteasy 返回 WebApplicationExcepti
  • 使用 N 路合并的时间复杂度

    我正在研究 2 路合并排序算法 并思考是否通过减少合并次数我们可以在时间方面获得更好的收益 例如 在 2 路合并中 我们有以下递归 T n 2T n 2 O n 时间复杂度为 N log base 2 N 如果我将问题除以 4 并合并 4
  • Go - 附加到结构上的切片不会持久[重复]

    这个问题在这里已经有答案了 我很难理解看似非常基本的操作 我想创建两个结构 其中一个结构将保存另一个结构的一部分 这是一个简单的例子来说明问题 Post structure type Post struct User string bson
  • 电子错误 AVDCreateGPUAccelerator:加载 GPU 渲染器时出错

    我正在尝试我的第一个电子应用程序 有谁知道为什么我收到此错误AVDCreateGPUAccelerator Error loading GPU renderer当我这样做时在终端npm start 目前看来还没有什么效果 我从安装一开始就使
  • 是否可以轻松地降低 ggplot 的饱和度?

    是否可以去饱和ggplot容易地 原则上 可能有两种可能的策略 首先 将一些函数应用于ggplot对象 或者 可能 Grob对象 来降低所有颜色的饱和度 二 打印的一些技巧ggplot渲染时降低饱和度 rmd文件 这两种策略对我来说都可以
  • 将字符串转换为 xsl 中的节点列表

    我目前有一个字符串 XSLT 1 0 我想将其转换为 NodeList 以便可以在以下示例中使用它 testString 表示 XML 树中的一个元素
  • Django 测试运行程序在 Ubuntu 上的 virtualenv 中失败

    我一直在努力解决 Ubuntu 14 04 上的 Python virtualenv 中安装的 Django 测试运行程序的问题 同样的软件在 MacOS 上运行良好 我认为在早期版本的 Ubuntu 上也运行良好 失败消息是 Import
  • utf-8 字符和 apache2 重写规则的问题

    我看到帖子了验证 htaccess 重写规则中的 utf 8 https stackoverflow com questions 2565864 validating utf 8 in htaccess rewrite rule我认为这很好
  • 使用 Asp.Net 主题时如何强制浏览器重新加载缓存的 CSS 文件? [复制]

    这个问题在这里已经有答案了 可能的重复 App Theme 文件夹中的 CSS 被缓存在浏览器中 https stackoverflow com questions 4517281 css in app theme folder gets
  • Discord.py 中的延迟命令

    我查看了很多地方 但找不到使用 ping 延迟 命令的方法discord py 像这样 client command pass context True async def pong ctx Somehow find pingtime aw
  • ASP.Net,母版页:每页样式表

    这些是我的假设 这些正确吗 使用 CSS 进行布局优于 使用表格 CSS 应提取到单独的文件中 而不是内联 CSS 是从 site master 中导入 链接 的 因此所有 css 都会导入 并应用于 所有 aspx 页面 鉴于此 我有一个
  • 在 data.frame 的列中填充字符串

    我有一个data frame X 有一个列A洋溢着chr 其中大部分属于nchar 5 但有些是nchar 4 我想放一个0在那些人面前 我会用以下伪代码来做到这一点 foreach element of X A as a this lin
  • jsPDF html 方法使用 addPage 在生成的 PDF 中分割页面

    我在用jsPDF s html为某些由多个段落组成的 html 生成 PDF 的方法p与每个p包含 50 500 个单词 PDF 是使用我定义的样式正确生成的 我面临的唯一问题是当内容p标签溢出到 PDF 中的新页面 剪切部分文本 如下所示
  • 如何使用sendinput函数C++

    尽管我从msdn看到了sendinput函数 但我不知道输入了什么参数 UINT WINAPI SendInput In UINT nInputs In LPINPUT pInputs In int cbSize 上面的参数是什么意思以及我
  • 使用 T-SQL 生成随机字符串

    如果您想使用 T SQL 生成伪随机字母数字字符串 您会怎么做 如何从其中排除美元符号 破折号和斜杠等字符 使用指南 SELECT randomString CONVERT varchar 255 NEWID 很短
  • 在 RSpec 测试中“let”真正节省了多少时间?

    我发现在代码中设置变量比使用变量容易得多let let很挑剔 总是告诉我错误使用的方式 当我在规范中使用简单的变量声明时 例如 tx good makeTransaction1 一切正常 但是当我使用let像这样 let tx good m
  • Django,级联移动到单独的表而不是级联删除

    我想在我们使用时保留数据delete 代替soft delete 使用 is deleted 字段 我想将数据移动到另一个表 对于已删除的行 https stackoverflow com a 26125927 433570 https s
  • 结果文档中生成空/空白命名空间声明

    我编写了一个用于将 XML 转换为 ePub 的包 一切正常 除了某些情况下 空白命名空间 xmlns 节点被写入结果文档 在转换之前 我准备了临时变量来保存主要段 即 meta body等 最后复制节点 使用xsl copy of cop