7

我的 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是一个开销,它没有被使用!


XSLT 必须使用命名空间但输出不使用的典型情况:

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

2 回答 2

8

正如 Dimitre 已经说过的,如果您没有xlink在 XSLT 中的任何地方使用名称空间,您应该只删除它的名称空间声明。但是,如果您的 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">
于 2013-03-23T06:06:28.727 回答
0

只需从指令中删除这个命名空间声明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>
于 2013-03-23T04:24:50.143 回答