【发布时间】:2013-12-16 15:30:37
【问题描述】:
最近,我一直在使用一个数据转换工具,它使用 XSL 来修改输入数据的格式。我最近有been having problems with the namespaces,现在我遇到了一个新问题,由上一个问题的解决方案引起。
正确的 xmlns 存储在父元素中,但是第一个子元素(唯一的第一级子节点)包含属性xmlns=""。我发现了一些类似的问题,但问题/实施方法的不同足以阻止我直接应用更改。有谁知道如何阻止该属性应用于子数据?我曾想过走我之前走的路(通过序列化 XML,然后进行字符串操作来修复它),但所需的序列化函数仅存在于 xpath 3 中,而我使用的转换服务器仅支持xpath 2,遗憾的是我没有发言权:(
我正在使用 Map Force 来构建 XSL 转换,因此不能简单地编辑 XSL(因为它将被 map force 覆盖),但我相信我可以将 XSL 更改应用于 Map Force。
XSLT 的片段
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:core="http://www.altova.com/MapForce/UDF/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="core xs fn">
<xsl:template name="core:firstCharacter">
...
</xsl:template>
<xsl:template name="core:tokenize-by-length-internal">
...
</xsl:template>
<xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="var1_SwiftMessages" as="node()?" select="SwiftMessages"/>
<xformResult xmlns="urn:...">
<xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance" select="'urn:... OutputInterface/xformResult.xsd'"/>
<xformResultRecord>
<xformResultData>
<Document>
<!-- REMAINDER OF FAIRLY STANDARD CODE -->
</Document>
</xformResultData>
</xformResultRecord>
</xformResult>
</xsl:template>
urn:... 是对输出文件规范的引用,xformResult.xsd 是输出文件的 Schema。
然后将转换器 XML 文件发送回处理程序,然后将 <xformResultData> 中的所有元素输出到文件中。这就是问题所在。输出文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:..." xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Cstmr xmlns="">
<!-- REMAINDER OF GENERATED XML -->
</Cstmr>
</Document>
如您所见,Document (Cstmr) 的第一级子级已通过转换器输出将xmlns="" 添加到元素中。当我用 Map Force 测试它时,它不包括在内,但它在 xform 工具的输出中。 xform 工具基于 SAXON,对它的调用是相当标准的 XML 函数。
【问题讨论】:
-
产生空命名空间的 XSLT 是什么样的?
-
您没有向我们展示生成 Cstmr 元素的代码,因此很难建议您如何更改它。无论代码是什么,它都会在没有命名空间的情况下生成 Cstmr 元素,而应该在 urn:... 命名空间中生成元素。
标签: xml xslt transformation xml-namespaces