删除 XSLT 映射生成的元素的名称空间前缀

Posted

技术标签:

【中文标题】删除 XSLT 映射生成的元素的名称空间前缀【英文标题】:Remove namespace prefix for elements generated by XSLT map 【发布时间】:2018-10-11 06:42:17 【问题描述】:

我的 XSLT 映射生成的元素都带有 ns0 前缀。 这是一个例子:

<ns0:EXF_tImportTableLog class="entity">
    <ns0:AmountInclVat>2457.7</ns0:AmountInclVat>
    <ns0:CompanyId>DC</ns0:CompanyId>
    <ns0:Credit>0</ns0:Credit>

我想删除这些前缀。这是我的 XSLT 代码的开始:

<?xml version="1.0" encoding="UTF-16"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" exclude-result-prefixes="msxsl var ScriptNS0 userCSharp ScriptNS1" version="1.0" xmlns:st="http://schemas.microsoft.com/dynamics/2008/01/sharedtypes" xmlns:ns0="http://Edi-Portal/Datacon/Documents/PurchaseInvoice" xmlns:ScriptNS0="http://schemas.microsoft.com/BizTalk/2003/ScriptNS0" xmlns:userCSharp="http://schemas.microsoft.com/BizTalk/2003/userCSharp" xmlns:ScriptNS1="http://schemas.microsoft.com/BizTalk/2003/ScriptNS1">
  <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
  <xsl:template match="/">
    <xsl:apply-templates select="/ns0:PurchaseInvoice_Cdm_Xml" />
  </xsl:template>
  <xsl:template match="/ns0:PurchaseInvoice_Cdm_Xml">

我认为我的问题是没有声明默认命名空间,因此映射器会自动将前缀放在每个元素上。我在 Visual Studio 中使用可视化映射器,因此此代码是自动生成的。

输入模式没有这个前缀,所以我不确定为什么会生成它。是否可以在可视化映射器中修复,或者我是否需要更改 XSLT 代码中的某些内容?

【问题讨论】:

嗯,为什么?前缀不是实际问题。如果您不想要任何前缀,最好不要使用命名空间。 【参考方案1】:

您向我们展示的 XSLT 代码片段不包含任何创建元素的指令,因此我们无法具体告诉您您做错了什么。

真正的问题不是前缀,而是元素的扩展名称错误(扩展名称 = 命名空间 URI + 本地名称)。

在结果树中创建元素有三种方式:

(a) 使用文字结果元素。在这种情况下,结果树中元素的扩展名称将与样式表中元素的扩展名称相同

(b) 使用 xsl:copy/xsl:copy-of。在这种情况下,结果树中元素的扩展名称将与源文档中元素的扩展名称相同

(c) 使用 xsl:element。 (c1) 具有命名空间属性,在这种情况下,元素将位于由该属性标识的命名空间中,或 (c2) 没有命名空间属性,在这种情况下,命名空间取决于样式表中的范围内命名空间。

我刚刚看到您正在使用 VS 映射器自动生成代码。我讨厌自己使用这些工具,因为它使调试变得非常复杂。

【讨论】:

谢谢,我通过更改源架构中的“ElementFromDefault”属性来解决这个问题。

以上是关于删除 XSLT 映射生成的元素的名称空间前缀的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 为所有元素和属性添加名称空间和前缀?

如何在 XSLT 输出中控制名称空间前缀(特别是默认名称空间)?

XSLT:如何删除同义名称空间

xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀

如何使用 XSLT 从 XML 中删除名称空间

使用 XSLT 进行空前缀转换的 XML [重复]