用于检索名称/值对的xpath表达式,忽略名称前面的名称空间

时间:2015-09-10 02:55:09

标签: xml xpath xslt-1.0

我有以下xml片段,我需要从xsl中的xpath表达式中提取值:

<?xml version="1.0" encoding="UTF-8"?>
<ns0:NotificationRequest xmlns:ns0="http://www.somedomain.com/schemas/message/Request">
   <ns1:Header xmlns:ns1="http://www.somedomain.com/schemas/common/Header">
      <ns1:Element1>Element 1 Value</ns1:Element1>
      <ns1:Element2>Element 2 Value</ns1:Element2>
   </ns1:Header>
   <ns0:MessageValues>
      <ns0:MessageValue>
         <ns0:Name>Name1</ns0:Name>
         <ns0:Value>Value1</ns0:Value>
      </ns0:MessageValue>
      <ns0:MessageValue>
         <ns0:Name>Name2</ns0:Name>
         <ns0:Value>Value2</ns0:Value>
      </ns0:MessageValue>
   </ns0:MessageValues>
</ns0:NotificationRequest>

要检索Element1或Element2的值,忽略名称空间,我知道我可以使用xsl / xpath表达式,如下所示:

   <xsl:value-of select="//*[local-name()='Element1']" />

但是,我正在努力使用xpath表达式来检索名称/值对部分中的ns0:Value节点的值。例如,无论命名空间如何,表达式看起来都是“Value1”或“Value2”。我知道如何使用命名空间,但我无法使用该方法,因为我需要处理的xml文件在同一文档中重用了名称空间。

1 个答案:

答案 0 :(得分:0)

Har07的答案非常酷,但我总是反过来做。 我选择了我想要的节点,然后使用同级节点对其进行限定(还要对我的同级节点命名,而不是将其命名为下一个节点):

//*[local-name()='Value'][../*[local-name()='Name' and .='Name1']]

适用于您的情况和答案的出色测试工具: http://www.xpathtester.com/xpath/38270fcac4d94d3d59b47069301f4456

例如,我们在带有REF段的EDI中进行了大量操作:

<ns0:X12_00401_850 xmlns:ns0="http://schemas.microsoft.com/BizTalk/EDI/X12/2006">
    <ns0:REF>
        <REF01>IA</REF01>
        <REF02>Name1</REF02>
    </ns0:REF>
    <ns0:REF>
        <REF01>VN</REF01>
        <REF02>Name1</REF02>
    </ns0:REF>
</ns0:X12_00401_850>

例如,您基本上想查找VN的REF02 ...

//*[local-name()='REF']//*[local-name()='REF02'][..//*[local-name()='REF01' and text()='VN']]

我认为通过添加第二个示例,它将有助于进行BizTalk和EDI的人们找到相同的问题/答案。