从输出中省略不必要的命名空间(Omit unneeded namespaces from the o

2019-07-22 20:00发布

我的XSLT是outputiung一些标签用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', . )" />

Answer 1:

正如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">


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


文章来源: Omit unneeded namespaces from the output