11

我写了“exclude-result-prefixes”,即便如此,我在输出中也看到了名称空间出现的外观。

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:simple="Simple name space"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
    xmlns:xh="http://www.w3.org/1999/xhtml"
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:transform-ext="urn:tridion:transform-ext"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="#default simple xh">

实际输出

<strong xmlns="Simple name space">abcd
    <link xmlns="http://www.w3.org/1999/xhtml">
        <text>Header</text>
    </link>
</strong>

是否有任何方法可以通过编写单个语句来排除所有命名空间。

这里我明确提到

exclude-result-prefixes="#default simple xh"

如何避免在 xslt 中出现所有命名空间?

4

4 回答 4

8

exclude-result-prefixes属性xsl:stylesheet,当指定为时,要求删除(仅)字面结果元素"yes"的任何命名空间节点,这些节点是继承的,并且不定义字面量结果元素的命名空间 uri 和前缀。

Markus Jarderot 的回答中的以下陈述是错误的

“exclude-result-prefixes 只是删除了结果根标签上的 xmlns:foo="" 属性。”

这是一个反例

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:z="z:z" exclude-result-prefixes="z">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <z:x xmlns:z="z:z">
   <z:y/>
  </z:x>
 </xsl:template>
</xsl:stylesheet>

当将此转换应用于任何 XML 文档(未使用)时,结果为:

<z:x xmlns:z="z:z">
   <z:y/>
</z:x>

我们看到

  1. 具有值 (namespace-uri) "z:z" 的命名空间的命名空间节点(和定义)不会从顶部元素(Markus Jarderot 称之为“根标签”)中删除。

  2. 带有前缀的命名空间"z"根本不会从任何文字元素中删除。

这表明了一个简单的事实,即exclude-result-prefixes="yes"如果命名空间不在 LRE(文字结果元素)上,并且即使命名空间节点在 LRE 上但正在定义元素所属的命名空间,则指定不能删除命名空间

为了从它所属的命名空间中删除一个元素,或者从非 LRE 元素中删除命名空间,我们需要指定一些额外的处理。

一个例子是将传统的身份规则替换为以下内容:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()[not(self::*)]">
     <xsl:copy>
       <xsl:apply-templates/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="*">
  <xsl:element name="{local-name()}">
   <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:attribute name="{local-name()}">
   <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

上述转换将任何元素或属性替换为属于“无命名空间”的相应元素或属性。它的一个潜在用途是将具有默认命名空间的文档转换为没有默认命名空间的文档。

例如,当应用于以下源 XML 文档时

<z:x xmlns:z="z:z">
    <z:y z:attr="someValue"/>
</z:x>

转换的结果是

<x>
   <y attr="someValue"/>
</x>

最后一个警告

如果应用于包含具有相同本地名称但属于两个不同名称空间的两个元素(或两个属性)的文档,则此转换可能是有害的 - 该转换将这些元素(或属性)替换为都属于同一名称空间的元素(或属性)(没有命名空间)。

于 2012-06-25T12:37:45.120 回答
3

exclude-result-prefixes只是删除xmlns:foo=""结果的根标记上的属性。标签仍然绑定到同一个命名空间。由于标签没有任何匹配的前缀,因此使用默认命名空间。

如果您希望完全删除命名空间,可以使用以下样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="no"/>

    <xsl:template match="/|comment()|processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

(来源:TEI 维基

于 2012-06-25T11:40:22.350 回答
2

exclude-result-prefixes 属性将(在某些情况下)从输出中删除未使用的命名空间声明。它永远不会删除结果中元素和属性实际使用的命名空间:也就是说,它永远不会更改元素和属性的名称以将它们放入不同的命名空间(或没有命名空间)。如果您希望元素不在命名空间中,则必须避免在生成它们时将它们放入命名空间,无论是使用文字结果元素、xsl:element 还是 xsl:copy。

于 2012-06-25T14:25:17.877 回答
0

尝试在您的样式表中使用它:

<stylesheet
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"   ...etc >

我在一些标签里面有这个:xmlns="http://www.w3.org/1999/xhtml,所以我添加了这两行,现在可以了。

这个来源帮助了我:http: //xmlplease.com/xhtmlxhtml

于 2013-04-17T14:45:41.787 回答