XSL命名空间问题

时间:2012-06-21 17:28:17

标签: xslt xsd xslt-1.0

我有一个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

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元素,如果您有节点集扩展函数,则可以提取该元素。