命名空间处理

时间:2012-07-05 04:32:43

标签: xml xslt xslt-1.0

我有一个xsl文件和2个输入xml文件,从中生成输出。在一个XML文件中,它们是一些导入到xsl文件的名称空间。但在其他XML文件中,命名空间不存在。 我必须以这样的方式处理我的XSL,它可以处理两个XML文件,因为XSL对于两个输入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">

第二个XML文件中的命名空间 - &gt;

<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文件中的命名空间 - &gt;

  <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文件时,它可以正常运行1st XML。但由于命名空间问题,它不适用于第二XML文件。

1 个答案:

答案 0 :(得分: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>