2012-07-05 131 views
1

我有一個xsl文件和2個輸入xml文件,從中生成輸出。在一個XML文件中,它們是一些被導入到xsl文件的名稱空間。但在其他XML文件中,名稱空間不存在。 我必須處理我的XSL,以便它可以處理兩個XML文件,因爲XSL對於這兩個輸入XML文件都很常見。 請建議。命名空間處理

命名空間中的第一個XML文件 - 在第二屆XML文件>

<TreeList xmlns="urn:sfti:documents:BasicTreeList:1:0"  
xmlns:cac="urn:sfti:CommonAggregateComponents:1:0" 
xmlns:cbc="urn:oasis:names:tc:ubl:CommonBasicComponents:1:0" 
xmlns:ccts="urn:oasis:names:tc:ubl:CoreComponentParameters:1:0" 
xmlns:cur="urn:oasis:names:tc:ubl:codelist:CurrencyCode:1:0" 
xmlns:sdt="urn:oasis:names:tc:ubl:SpecializedDatatypes:1:0" 
xmlns:udt="urn:oasis:names:tc:ubl:UnspecializedDatatypes:1:0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

命名空間 - >

<TreeList xmlns:cac="urn:sfti:CommonAggregateComponents:1:0" 
xmlns:cbc="urn:oasis:names:tc:ubl:CommonBasicComponents:1:0" 
xmlns:ccts="urn:oasis:names:tc:ubl:CoreComponentParameters:1:0" 
xmlns:cur="urn:oasis:names:tc:ubl:codelist:CurrencyCode:1:0" 
xmlns:sdt="urn:oasis:names:tc:ubl:SpecializedDatatypes:1:0" 
xmlns:udt="urn:oasis:names:tc:ubl:UnspecializedDatatypes:1:0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

在XSL文件命名空間 - >

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:abc="urn:sfti:documents:BasicTreeList:1:0" 
    xmlns:cac="urn:sfti:CommonAggregateComponents:1:0" 
    xmlns:cbc="urn:oasis:names:tc:ubl:CommonBasicComponents:1:0"> 

當我跑我的XSL文件運行良好與第一XML。但由於命名空間問題,它不適用於2nd XML文件。

回答

1

如果您想使用相同的XSLT代碼來處理在其詞彙表中使用相同本地名稱但名稱空間不同的源文檔,那麼最好的解決方案是預處理其中一個文件以更改名稱空間。這可以通過使用包含以下模板的樣式表完成:

<xsl:template match="*[namespace-uri()='old-uri']"> 
    <xsl:element name="{local-name()}" namespace="new-uri"> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates select="*"/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*[namespace-uri()='old-uri']"> 
    <xsl:attribute name="{local-name()}" namespace="new-uri"> 
    <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <xsl:apply-templates select="*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:copy/> 
</xsl:template> 
+0

正如問題中我有多個命名空間,所以我必須創建多個模板! – Kundan

+0

也許你沒有仔細閱讀。我的建議是預處理輸入,以便使用標準化的命名空間。然後在你的主要處理步驟中,你不必處理不必要的變化。 –