选择与特定节点的并集匹配的所有子项

时间:2015-04-21 16:32:36

标签: xml xpath

假设我有这个xml节点:

<a>
    <b></b>
    <c></c>
    <d></d>
</a>

我想选择特定节点的所有子节点,其中包含我和我一起使用的XPATH列表。

e.g。 /a/*[.=/a/b | = / A / d]

应该只选择<b> and <d>个节点,但它会选择所有节点:<b>,<c>,<d>

我该怎么做?

  

完整详情:

<BooksInfo>
    <Publisher Repeat="true">
        <PublisherName/>
        <Author Repeat="true">
            <AuthorName/>
            <Book Repeat="true">
                <BookName/>
                <Chapter Repeat="true"/>
                <Preface/>
                <Contents/>
            </Book>
            <Magazine>
                <MagazineName/>
                <Chapter Repeat="true"/>
                <Title/>
            </Magazine>
        </Author>
    </Publisher>
</BooksInfo>

我的应用程序基于Visual Studio Tools For Office - 内容控件。我的应用程序的作用是,假设我将book / chapter元素放在我的word文档上,然后在它周围应用Repeating Section Content Control。现在我想为这个内容控件应用一个XmlMapping,并希望向用户显示一个对话框,他可以从中选择XmlNode从哪里重复Chapter元素。

现在,本章可以来自<Magazine> or <book>个节点,但用户已将<book>/chapter放在文档上,因此,弹出窗口应显示为选项 - 仅显示book元素中的章节而不是杂志元素。

我在WPF中有一个树视图,它基于HierarchicalDataTemplate,我将ItemsSource设置为一个XPath表达式,应该这样做。

这就是我的表达方式: [除了上述条件,它应该只显示带有&#34;重复=&#39;真&#39;&#34;或者带有后代的节点&#34;重复=&#39;真&#39;&#34;

表达式:

./*[(@Repeat="true" or .//*[@Repeat="true"]) and ({0})]

{0}部分,我通过插入已放在文档上的元素来动态添加。

上述场景的XPath实例是:

./*[(@Repeat="true" or .//*[@Repeat="true"]) and (self::Chapter)]

但是这将在弹出树视图中显示以下选项:

BooksInfo
    - Publisher
        - Author
            - Book
                - Chapter
            - Magazine
                - Chapter

当我将当前节点与完整的XPath进行比较而不仅仅是节点的名称时,只能删除最后一个Magazine / Chapter,如下所示:

./*[(@Repeat="true" or .//*[@Repeat="true"]) and (self::/BooksInfo/Publisher/Author/Magazine/Chapter)]

1 个答案:

答案 0 :(得分:1)

您尝试表达的问题是=没有按照您的想法行事。您假设=的工作方式类似于is运算符,测试节点标识。但事实上,像

这样的表达
. = /a/d

测试上下文节点的字符串值是否等于右侧路径所评估的元素的字符串值。

上面的表达式计算为布尔值,因此

 .=/a/b | .=/a/d

包含两个布尔值,与union结合使用。

如果您只想选择bd元素,请使用

 /a/*[self::b or self::d]

将返回(单个结果由-------分隔):

<b/>
-----------------------
<d/>

此外,如果您有一组XPath表达式,为什么不简单地评估那些,由union分隔?

/a/d | /a/b

结果集相同。