gpt4 book ai didi

xslt - 如何通过在 XSLT 中编写单个语句来避免输出中出现所有 namespace

转载 作者:行者123 更新时间:2023-12-04 02:03:06 24 4
gpt4 key购买 nike

我写了“exclude-result-prefixes”,即便如此,我还是在输出中看到了 namespace 出现的外观。

<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 中出现所有命名空间?

最佳答案

exclude-result-prefixes xsl:stylesheet 的属性,当指定为 "yes"强制删除任何继承的并且未定义字面结果元素的 namespace-uri 和前缀的字面结果元素(仅)的任何命名空间节点。

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

"exclude-result-prefixes just removes the xmlns:foo="" attributes on the root tag of the result."



这是一个反例 :
<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>

我们看到 :
  • 带有值 (namespace-uri) "z:z"的命名空间的命名空间节点(和定义)不会从顶部元素中移除(Markus Jarderot 称之为“根标记”)。
  • 前缀为 "z" 的命名空间根本没有从任何文字元素中删除。

  • 这显示了指定 exclude-result-prefixes="yes" 的简单事实。如果 namespace 不在 LRE(文字结果元素)上并且即使 namespace 节点在 LRE 上但正在定义元素所属的 namespace ,则无法删除 namespace .

    为了从它所属的命名空间中删除一个元素,或者从非 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>

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

    例如,当应用于以下源 XML 文档 时:
    <z:x xmlns:z="z:z">
    <z:y z:attr="someValue"/>
    </z:x>

    转换的结果是 :
    <x>
    <y attr="someValue"/>
    </x>

    最后一个警告 :

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

    关于xslt - 如何通过在 XSLT 中编写单个语句来避免输出中出现所有 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11188403/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com