我有以下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文件在同一文档中重用了名称空间。
答案 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的人们找到相同的问题/答案。