选择元素时忽略XML名称空间前缀 - XSLT

时间:2012-11-30 23:05:28

标签: xslt

XML Version 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 Version 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代码适用于这两个版本?请赐教!

2 个答案:

答案 0 :(得分:5)

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

<?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>

答案 1 :(得分:4)

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

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

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

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

如果您在第一个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命名空间前缀的命名空间,或第二个示例文档中的null namespace-prefix。

任何寻址这些元素的XSLT和XPath都应返回相同的结果。

您的XSLT中的模板匹配不适用于任何一个文档,因为College不是inboundData的孩子。

您需要将其调整为:

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

b:inboundData//a:College/*