2012-06-21 311 views
0

我有一个将一个XSD转换为另一个具有稍微不同格式的XSD的XSL。 (基本上,目标文件将被标准化)。目标中的另一个主要区别是添加默认名称空间和目标名称空间。我无法实际得到的命名空间这里是我的XSL的一个片段:。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 =“$命名空间”的标记到每个子节点。我不是XSLT的绝对专家。我没有必要自己开发它,因为BizTalk地图为你生成了所有的东西,但是这个XSL比我可以使用BizTalk地图处理更复杂。

哦,我仅限于XSLT 1.0

回答

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元素的命名空间节点。

+0

我会研究它,看看EXSLT是否是一个选项。一旦我发现它是否是一种选择,我会考虑是否可以说服我的组织中的人员对此感到满意。如果不是,那么简短的答案是,这是不可能的,因为我的限制? – TimWagaman

+0

我不认为这是可能的一次通过xslt 1没有扩展功能。在纯xslt1中可以做的是使用一个样式表来计算目标名称空间,然后写出一个_stylesheet_,其中该名称空间是一个文字常量,然后应用生成的样式表。 –