2012-06-21 227 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_,其中該名稱空間是一個文字常量,然後應用生成的樣式表。 –