【问题标题】:Namespace Handling命名空间处理
【发布时间】:2012-07-05 04:32:42
【问题描述】:

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

<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 运行良好。但由于命名空间问题,它不适用于第二个 XML 文件。

【问题讨论】:

    标签: xml xslt xslt-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>
    

    【讨论】:

    • 问题中我有多个命名空间,所以我必须创建多个模板!
    • 可能你读的不够仔细。我的建议是预处理输入,以便它使用标准化的命名空间。然后在您的主要处理步骤中,您不必处理不必要的品种。
    猜你喜欢
    • 2011-08-16
    • 2013-01-25
    • 2011-09-05
    • 2021-08-02
    • 1970-01-01
    • 2013-04-11
    • 2012-01-06
    • 2011-07-07
    • 2014-05-31
    相关资源
    最近更新 更多