【问题标题】:How to avoid namespace coming in output XML in XSLT如何避免命名空间出现在 XSLT 中的输出 XML 中
【发布时间】:2012-03-29 14:50:32
【问题描述】:

我正在通过 XSLT 处理 XML 到 XML 的转换。我想删除输出 xml 中的名称空间。为此,我使用了排除结果前缀选项,但在输出中我仍然看到命名空间。

源 XML:

 <?xml version="1.0" encoding="ISO-8859-1"?>
 <aaa>
 hello
 </aaa>

XSLT 编写:

 <?xml version="1.0" encoding="utf-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"      xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:simple="aaaa" xmlns:xlink="http://www.w3.org/1999/xlink"      xmlns:tcm="http://www.tridion.com/ContentManager/5.0" exclude-result-prefixes="msxsl simple wireframe widget tcdl tcm xlink"      xmlns:wireframe="bbb" xmlns:widget="ccc" xmlns:tcdl="tcdl">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
 <xsl:template match="/">
  <wireframe:wireframe>
       <wireframe:si>
         <widget:ah>
         <xsl:value-of select="aaa" />
               </widget:ah> 
         </wireframe:si>
 </wireframe:wireframe>
 </xsl:template>
   </xsl:stylesheet>

产生的输出:

 <?xml version="1.0" encoding="utf-8"?>
 <wireframe:wireframe xmlns:wireframe="aaaa">
   <wireframe:si>
     <widget:ah xmlns:widget="bbb">
 hello
 </widget:ah>
   </wireframe:si>
 </wireframe:wireframe>

预期输出:

 <?xml version="1.0" encoding="utf-8"?>
 <wireframe:wireframe>
   <wireframe:si>
     <widget:ah>
 hello
 </widget:ah>
   </wireframe:si>
 </wireframe:wireframe>

请告诉我如何避免在输出 XML 中出现命名空间。

提前谢谢你。

【问题讨论】:

  • 您能否提供有问题的 XML 和 XSLT 文件的 sn-p。
  • 您提供的预期输出不是有效的 XML,因为它缺少命名空间定义。为什么你甚至需要它?
  • 只是为了澄清,您是否试图创建对用户控件、标签库或类似的东西的引用?正如 newtover 所问,尚不清楚为什么需要前缀。

标签: xml xslt xslt-2.0 tridion


【解决方案1】:

虽然这是非常糟糕的做法,但实际上可以生成这种格式不正确的 XML。您可以将 XSLT 的输出类型设置为文本,然后生成无命名空间标签,如下所示:

<xsl:text disable-output-escaping="yes">&amp;lt;wireframe:wireframe&amp;gt;</xsl:text>

等等..

就我个人而言,我认为这是“不要在家里尝试这个”类别,但如果你不为正确的 xslt 风格付出一分钱,那就去吧!

【讨论】:

  • 我不会是这样一个纯粹主义者。做这样的事情通常有充分的理由。例如,您想生成序列化 XML 的片段以嵌入到更大的文档中。只要将输出类型指定为文本,它就不再是 XML!无论如何,为实际回答问题 +1。
  • 我不能像多米尼克一样给你+1,我认为这不是输出有效的XML,所以没有真正回答这个问题。如果问题是“我正在通过 XSLT 处理 XML 到文本的转换......”你会得到我的投票。
【解决方案2】:

您可以在 exclude 属性中省略两个使用的命名空间,如下所示:

exclude-result-prefixes="msxsl simple xlink tcm tcdl"

这将确保使用的两个命名空间出现在根元素中,而不是出现在第一次使用它们的元素中;结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<wireframe:wireframe xmlns:widget="ccc" xmlns:wireframe="bbb">
    <wireframe:si>
        <widget:ah>
 hello
 </widget:ah>
    </wireframe:si>
</wireframe:wireframe>

【讨论】:

    【解决方案3】:

    你要求的东西是不可能的! XML 命名空间是 XML 语言的一部分,这就像要求剥离 Java 中的所有包或 C# 中的命名空间!

    简而言之,您希望 XML 输出是一个无效的 XML 文档,因此您不能从 XSLT 创建它,该 XSLT 旨在生成有效的 XML。

    您可以通过从 XSLT 中删除命名空间前缀来完全删除它们:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
        <xsl:template match="/">
            <wireframe>
                <secureInbox>
                    <alertHeader>
                        <xsl:value-of select="aaa" />
                    </alertHeader>
                </secureInbox>
            </wireframe>
        </xsl:template>
    </xsl:stylesheet>
    

    这会产生以下结果:

    <wireframe>
        <secureInbox>
            <alertHeader>
                hello
            </alertHeader>
        </secureInbox>
    </wireframe>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 2011-04-13
      • 2012-03-05
      • 1970-01-01
      • 2012-03-10
      • 2016-12-30
      相关资源
      最近更新 更多