XPath Select:相对路径不适用于后续同级

时间:2018-08-14 22:45:12

标签: xml xpath xpath-1.0

我已经多次问过这个问题,但方式略有不同。看看类似的例子,我仍然缺少一些东西。

使用以下信息,我正在尝试进行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?

1 个答案:

答案 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::*