【问题标题】:Omit unneeded namespaces from the output从输出中省略不需要的命名空间
【发布时间】:2013-03-13 01:06:55
【问题描述】:

我的 XSLT 正在输出一些带有xmlns:x="http://something" 属性的标签...如何避免这个冗余属性?输出 XML 从不使用,既不在 x:tag 中,也不在 x:attribute 中。


XML 示例:

<root><p>Hello</p><p>world</p></root>

XSL 示例:

<xsl:transform version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
   xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:output encoding="UTF-8" method="xml" version="1.0" indent="no"/>

<xsl:template match="root"><foo>
   <xsl:for-each select="p">
    <p><xsl:value-of select="." /></p>
   </xsl:for-each></foo>
   <xsl:for-each select="x">
    <link xlink:href="{x}" />
   </xsl:for-each></foo>
</xsl:template>

XML 输出示例:

<foo>
   <p xmlns:xlink="http://www.w3.org/1999/xlink">Hello</p>
   <p xmlns:xlink="http://www.w3.org/1999/xlink">world</p>
</foo>

xmlns:xlink 是开销,没有使用!


A typical case 其中 XSLT 必须使用命名空间但输出不是:

 <xsl:value-of select="php:function('regFunction', . )" />

【问题讨论】:

  • 请编辑问题并提供源 XML 文档和转换代码。没有这些就不得不猜测了。
  • 好的,我编辑了:XML-IN、XSLT 和 XML-OUT 的源代码。

标签: xslt output xml-namespaces


【解决方案1】:

正如 Dimitre 已经说过的,如果您没有在 XSLT 中的任何位置使用 xlink 命名空间,您应该删除它的命名空间声明。但是,如果您的 XSLT 实际上在您没有向我们展示的地方使用它,您可以通过使用 exclude-result-prefixes 属性来防止它被输出:

<xsl:transform version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   exclude-result-prefixes="xlink">

【讨论】:

  • 非常感谢,exclude-result-prefixes 是工具!关于“......只需删除其命名空间声明......”解决方案,我编辑了这个问题,以避免这种“微不足道的情况”。
【解决方案2】:

只需从xsl:stylesheet 指令中删除这个命名空间声明——它根本不被使用(因此是必要的):

xmlns:xlink="http://www.w3.org/1999/xlink"

现在整个转变变成了:

<xsl:transform version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output encoding="UTF-8" method="xml" version="1.0" indent="no"/>

 <xsl:template match="root"><foo>
   <xsl:for-each select="p">
   <p class="a"><xsl:value-of select="." /></p>
   </xsl:for-each></foo>
 </xsl:template>
</xsl:transform>

当应用于提供的 XML 文档时:

<root><p>Hello</p><p>world</p></root>

产生没有命名空间的结果:

<foo>
    <p class="a">Hello</p>
    <p class="a">world</p>
</foo>

【讨论】:

  • 谢谢,我编辑了一个典型案例。另一个是未使用的xsl:if。
  • @PeterKrauss, exclude-result-prefixes="{}空格分隔的前缀列表" 在许多情况下都可以提供帮助。在其他情况下,仍然需要通过代码删除名称空间。顺便说一句,我在您发布的代码中没有看到任何 xsl:if。
  • @PeterKrauss,是的,在这种特定情况下,使用 exclude-result-prefixes 属性可以解决问题。还有更多棘手的情况——不是在文字结果元素上,需要真正防止命名空间节点的复制——通过代码。
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2012-10-16
  • 2011-08-15
相关资源
最近更新 更多