2010-05-20 79 views
1

我正在使用XSLT 2.0來轉換XML架構。第一個模式(s1.xsd)進口第二架構(s2.xsd)如下:使用XSLT合併兩個xml架構

s1.xsd

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema.xsd" 
    xmlns:ns1="URI1" targetNamespace="URI2" 
    elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <import namespace="URI1" schemaLocation="s2.xsd"/> 
    <element name="element1"/> 
    <element name="element2"/> 
</schema> 

和s2.xsd的內容的內容

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    xmlns:ns1="URI1" targetNamespace="URI1"> 
    <attribute name="attr1"/> 
<schema> 

我XSLT聲明XS命名空間如下:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

我想s2.xsd的節點合併到<架構>-s1.xsd的元素。到目前爲止,我已經試過

<xsl:template name="merge_imported_schemas"> 
    <xsl:for-each select="/schema/import[@namespace = //namespace::*]"> 
     <!-- file exists? --> 
     <xsl:choose> 
      <xsl:when test="boolean(document(@schemaLocation))"> 
       <!-- schema found --> 
       <xsl:copy-of select="document(@schemaLocation)/*/node()"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <!-- schema not found --> 
       <xsl:message terminate="yes"> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each> 
</xsl:template> 

,但我沒有得到期望的結果。任何人都可以告訴我我做錯了什麼?我懷疑這裏有一個命名空間衝突,但老實說,我發現使用命名空間有點混亂。謝謝!

+0

我真正想要的是將s2.xsd的內容附加到s1.xsd,然後將s1.xsd解析爲單個文件。據我所知,這是不可能的,但是解決方法包括使用臨時結果樹(請參閱http://www.xml.com/pub/a/2003/12/03/tr.html) 。爲實現這一點,調用似乎有伎倆。 – conciliator 2010-05-20 14:14:07

回答

2

您需要限定XPath中的元素。目前select="/schema/import[@namespace = //namespace::*]">根本不匹配任何東西,因爲沒有元素/schema。 XPath試圖與名稱空間中的元素匹配。

更改爲select="/xs:schema/xs:import[@namespace = //namespace::*]">,它應該工作。請記住,名稱空間前綴是名稱空間URI的別名,並且如果您有一個默認名稱空間(如在xsd文件中),那麼不帶前綴的元素仍然具有名稱空間限定的名稱空間。

順便說一句,您可以使用<xsl:apply-templates select="/xs:schema/node()"代替<xsl:for-each select="/schema/import[@namespace = //namespace::*]">,併爲要複製到輸出樹的不同類型的節點定義不同的模板。

+0

謝謝保羅,我忘了。 :)在用正確的命名空間前綴擴充XPath查詢之後,我決定嘗試計算節點數量。像這樣: Before: After: conciliator 2010-05-20 13:01:11

+0

從給出的信息看來,您可能會丟棄原始模式中的元素。 – 2010-05-20 13:06:44

+0

好吧,那可能就是這樣。然而,我用更改了(在s2中計算/ schema下的元素數目)。 XSD)。它說22 ...我很失落。 – conciliator 2010-05-20 13:17:52