我已经多次问过这个问题,但方式略有不同。看看类似的例子,我仍然缺少一些东西。
使用以下信息,我正在尝试进行XPath 1.0选择,以从具有帐户的XML中获取一组唯一的客户帐户值。无法使用带有模板(每个模板)和Muenchian分组的XSLT。
我有这个XML:
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Body xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<MessageParts xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<ReportArchive xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/ReportArchive">
<Report class="entity">
<_DocumentHash>d1fd3992e1d6cde8fd06512cea125792</_DocumentHash>
<ReportSection class="entity">
<Name>AddressBody</Name>
<Type>Body</Type>
<ReportSectionField class="entity">
<Name>CustTable_AccountNum</Name>
<Value>0000000001</Value>
</ReportSectionField>
</ReportSection>
<ReportSection class="entity">
<Name>AddressBody</Name>
<Type>Body</Type>
<ReportSectionField class="entity">
<Name>CustTable_AccountNum</Name>
<Value>0000000001</Value>
</ReportSectionField>
</ReportSection>
<ReportSection class="entity">
<Name>AddressBody</Name>
<Type>Body</Type>
<ReportSectionField class="entity">
<Name>CustTable_AccountNum</Name>
<Value>0000000002</Value>
</ReportSectionField>
</ReportSection>
<ReportSection class="entity">
<Name>AddressBody</Name>
<Type>Body</Type>
<ReportSectionField class="entity">
<Name>CustTable_AccountNum</Name>
<Value>0000000003</Value>
</ReportSectionField>
</ReportSection>
<ReportSection class="entity">
<Name>AddressBody</Name>
<Type>Body</Type>
<ReportSectionField class="entity">
<Name>CustTable_AccountNum</Name>
<Value>0000000004</Value>
</ReportSectionField>
</ReportSection>
<ReportSection class="entity">
<Name>AddressBody</Name>
<Type>Body</Type>
<ReportSectionField class="entity">
<Name>CustTable_AccountNum</Name>
<Value>0000000005</Value>
</ReportSectionField>
</ReportSection>
</Report>
</ReportArchive>
</MessageParts>
</Body>
</Envelope>
使用此XPath:(//*[local-name()='ReportSectionField'][./*[local-name()='Name'] = 'CustTable_AccountNum']/*[local-name()='Value'])[not(. = following-sibling::*)]/text()
使用“()”,我的假设是相对路径选择将创建一个节点集,然后“ not()”过滤器部分将解析结果集中的每个同级并返回唯一值。当我使用“跟随兄弟”轴时,此操作失败,但是“跟随”轴有效。我不想遍历后代,因此“跟随”不是我要使用的轴。我想念的是什么,有人可以帮助我了解发生了什么吗?
其他一些注意事项: -XPath编译器是BizTalk使用的基于.Net(1.0)的版本(请参阅本文,了解以下原因:XPath and XSLT 2.0 for .NET?)
答案 0 :(得分:0)
XPath处理源文档中的节点。因此,相对于所选reshape(df, idvar = c('ID', 'Month'), direction = 'wide', timevar = 'Year')
# ID Month Value.2015 Value.2016 Value.2017
#1 a 1 1 2 3
#2 a 2 1 2 3
#3 a 3 1 2 3
#10 b 1 6 9 12
#11 b 2 7 10 13
#12 b 3 8 11 14
元素,您仍然需要查看value
轴,因为其他following::
元素不是同级。
在选择value
元素以与之比较值时,可以通过“跳到” value
元素,然后查看{{1} },它们符合相同的选择标准,可以找到ReportSection
个元素进行比较和过滤:
following-sibling::*