2012-07-05 88 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

也许你没有仔细阅读。我的建议是预处理输入,以便使用标准化的命名空间。然后在你的主要处理步骤中,你不必处理不必要的变化。 –