无法获取父路径和子节点具有不同默认命名空间的xpath

时间:2013-06-02 23:23:43

标签: xml xslt xpath xml-namespaces

我遇到的情况是,我必须使用xslt解析和转换给定的XML。我需要编写xpath来执行此操作。

下面给出了样本xml。 ServiceProviderGroupPackage和SecondNode中的位置具有不同的名称空间。我需要获取 IReference 节点的命名空间来获取其值。

<?xml version="1.0" encoding="utf-8" ?>
<ServiceProviderGroupPackage Version="1.2.0" xmlns="http://webconnectivity.co.uk/ServiceProviderGroupPackage"
                             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                             xmlns:wsa="http://www.w3.org/2005/08/addressing">
  <FirstNode Version="1.2.0" xmlns="http://www.MySite.org/Standards/MySiteMsgSvc/1"
                    xmlns:rlc="http://www.MySite.org/standards/SecondNode/1"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  </FirstNode>
  <SecondNode Version="2010-2" xmlns:ac="http://www.MySite.org/Standards/MySiteMsgSvc/1"
                      xmlns="http://www.MySite.org/standards/SecondNode/1"
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xmlns:lloyds="http://www.lloyds.com/The-Market/Operating-at-Lloyds/Resources/Risk_codes">
    <Movement Sender="Sender" Receiver="Receiver">
      <Contract>
        <Type>direct</Type>
        <Nature>lm_proportional_or_nonproportional</Nature>
        <Reference>B0509311011UMR</Reference>
        <IReference>P00000062MM/13A</IReference>
      </Contract>
    </Movement>
  </SecondNode>
</ServiceProviderGroupPackage>

1 个答案:

答案 0 :(得分:2)

如果不覆盖,每个元素都会继承父元素的名称空间,因此IReference元素具有与SecondNode元素http://www.MySite.org/standards/SecondNode/1相同的名称空间。


要检索任意元素的命名空间,请使用namespace-uri(...)函数。

使用XPath 2.0,您可以使用通配符 - 运算符*而不是命名空间前缀:

namespace-uri(//*:IReference)

//*:IReference/namespace-uri()

使用XPath 1.0,您必须检查谓词中的名称:

namespace-uri(//*[local-name() = "IReference"])