我有一个XSL,它将一个XSD转换为另一个格式略有不同的XSD。(基本上,目标文件将被规范化)。目标中的另一个主要区别是添加默认命名空间和目标命名空间。我在实际获取命名空间时遇到问题。这是我的 XSL 的一个片段:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8"/>
<xsl:variable name="Unions" select="'Yes'"/>
<xsl:variable name="myname" select="//Table/Name"/>
<xsl:variable name="namespace" select="concat('http://mynamespace/', $myname)"/>
<xsl:template match="/">
<xsl:element name="xsd:schema" namespace="http://www.w3.org/2001/XMLSchema" xmlns="$namespace"
<xsl:attribute name="targetNamespace">
<xsl:value-of select="$namespace"/>
</xsl:attribute>
<xsl:attribute name="elementFormDefault">qualified</xsl:attribute>
<xsl:attribute name="attributeFormDefault">unqualified</xsl:attribute>
...
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这就是我得到的:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema targetNamespace="http://mynamespace/somename" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="">
...
</xsd:schema>
xmlns="$namespace" 被标记到每个子节点上。我不是 XSLT 的绝对专家。我不必自己开发它,因为 BizTalk 映射会为您生成所有内容,但此 XSL 比我让 BizTalk 映射处理的要复杂得多。
哦,我仅限于 XSLT 1.0
使用动态生成的值生成命名空间节点是 XSLT 1 无法真正做到的。 XSLT 2 专门添加了xsl:namespace
来构造这些东西。
说你被困在 XSLT 1 上。您是否有 EXSLT 或任何其他扩展命名空间可用于为您提供 node-set() 扩展?如果是这样,你可以去
<xsl:template match="/">
<xsl:variable name="x">
<xsl:element name="x" namespace="{$namespace}">
<xsl:element name="xsd:schema" namespace="http://www.w3.org/2001/XMLSchema">
....
</xsl:variable>
<xsl:copy-of select="xx:node-set($x)/*/*"/>
</xsl:template>
在所需的命名空间中<x>
创建一个虚假元素,这会强制命名空间节点转到其子xs:schema
元素,如果您有节点集扩展函数,则可以提取该元素。