1

XML 版本 1

<inboundData xmlns="urn:college:names:ws:docexchange">
<Root>
        <College Version="5.0" xmlns:cidx="urn:abc:names:specification:col:schema:all:5:0" xmlns="urn:abc:names:specification:col:schema:all:5:0">
           <Header>
              <Address>
                 <AddressLine1>4600 Big Tree Way</AddressLine1>
              </Address>
           </Header>
    </College>
</Root>
</inboundData>

XML 版本 2

<inboundData xmlns="urn:college:names:ws:docexchange">
<Root>
        <ns1:College Version="5.0" xmlns:ns1="urn:abc:names:specification:col:schema:all:5:0">
           <ns1:Header>
              <ns1:Address>
                 <ns1:AddressLine1>4600 Big Tree Way</ns1:AddressLine1>
              </ns1:Address>
           </ns1:Header>
    </ns1:College>
</Root>
</inboundData>

XSL 代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="urn:abc:names:specification:col:schema:all:5:0" xmlns:b="urn:college:names:ws:docexchange">
<xsl:template match="/">
    <xsl:copy-of select="b:inboundData/b:College/*"/>
</xsl:template>
</xsl:stylesheet>

XSL 代码中的更正。(阅读汉森的回复后发现错误)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="urn:abc:names:specification:col:schema:all:5:0" xmlns:b="urn:college:names:ws:docexchange">
<xsl:template match="/">
    <xsl:copy-of select="b:inboundData/b:Root/*"/>
</xsl:template>
</xsl:stylesheet>

XSL 代码适用于 XML 版本 1。由于额外的命名空间“ns1”,它不适用于类型 2。如何使 xsl 代码适用于这两个版本?请赐教!

4

2 回答 2

6

您可以按元素的本地名称匹配元素,例如

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:a="urn:abc:names:specification:col:schema:all:5:0" 
    xmlns:b="urn:college:names:ws:docexchange">
  <xsl:template match="/">
    <xsl:copy-of select="b:inboundData/*[local-name()='College']/*"/>
  </xsl:template>
</xsl:stylesheet>
于 2012-11-30T23:24:20.543 回答
4

College元素绑定到两个文档的相同命名空间。

XML 文档是否使用命名空间前缀或者它们是否具有不同的前缀值是无关紧要的。它们被 XML 处理器“视为”为相同类型的元素,并且通过 XPath 以相同的方式寻址,因为它们绑定到相同的名称空间。

XPath 语句中使用的命名空间前缀不必与 XML 文档中的命名空间前缀匹配(因为无法预测某人可能选择使用哪些命名空间前缀)。但是,它绑定的命名空间必须匹配。

您的两个 XML 文档是等效的。无论元素是否具有命名空间前缀,元素都绑定到相同的命名空间。

如果您在第一个 XML 文档中查看它们是如何声明的以及它们映射到什么:

<College Version="5.0" 
 xmlns:cidx="urn:abc:names:specification:col:schema:all:5:0"
 xmlns="urn:abc:names:specification:col:schema:all:5:0">

声明一个College没有命名空间前缀的元素,该元素绑定到命名空间urn:abc:names:specification:col:schema:all:5:0,因为声明了没有命名空间前缀的命名空间xmlns="urn:abc:names:specification:col:schema:all:5:0"

在第二个例子中:

<ns1:College Version="5.0" 
     xmlns:ns1="urn:abc:names:specification:col:schema:all:5:0">

College声明使用绑定到命名空间的命名空间前缀命名的元素urn:abc:names:specification:col:schema:all:5:0

两个示例中这些College元素的后代元素都绑定到与College定义ns1第一个示例中的 namespace-prefix 或第二个示例文档中的 null namespace-prefix 的命名空间的元素相同的命名空间。

任何处理这些元素的 XSLT 和 XPath 都应该返回相同的结果。

XSLT 中的模板匹配不应该适用于任何一个文档,因为College它不是inboundData.

您要么需要将其调整为:

b:inboundData/b:Root/a:College/*

或者

b:inboundData//a:College/*
于 2012-12-01T01:09:49.187 回答