我有一个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 文件中的命名空间 ->
<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 文件一起使用。
如果要使用相同的 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>