我遇到的情况是,我必须使用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>
答案 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"])