如何通过在XSLT中编写单个语句来避免输出中的所有命名空间

Pat*_*tan 11 xslt

我写了"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">
Run Code Online (Sandbox Code Playgroud)

实际产出

<strong xmlns="Simple name space">abcd
    <link xmlns="http://www.w3.org/1999/xhtml">
        <text>Header</text>
    </link>
</strong>
Run Code Online (Sandbox Code Playgroud)

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

在这里我明确提到了

exclude-result-prefixes="#default simple xh"
Run Code Online (Sandbox Code Playgroud)

如何避免xslt中的所有命名空间外观?

Dim*_*hev 8

当指定为强制删除所继承的litreral结果元素(仅)的任何命名空间节点时,该exclude-result-prefixes属性xsl:stylesheet,并且不定义文本结果元素的namespace-uri和prefix."yes"

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>
Run Code Online (Sandbox Code Playgroud)

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

<z:x xmlns:z="z:z">
   <z:y/>
</z:x>
Run Code Online (Sandbox Code Playgroud)

我们看到:

  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>
Run Code Online (Sandbox Code Playgroud)

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

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

<z:x xmlns:z="z:z">
    <z:y z:attr="someValue"/>
</z:x>
Run Code Online (Sandbox Code Playgroud)

转型的结果是:

<x>
   <y attr="someValue"/>
</x>
Run Code Online (Sandbox Code Playgroud)

最后一个警告:

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