2017-03-03 122 views
1

考虑下面的XML文档:的XPath:选择根,过滤子元素

<inst> 
    <ins> 
    <id>id_01</id> 
    <pos>1</pos> 
    </ins> 
    <ins> 
    <id>id_02</id> 
    <pos>1</pos> 
    </ins> 
</inst> 

我试图让下面的输出:

<inst> 
    <ins> 
    <id>id_01</id> 
    <pos>1</pos> 
    </ins> 
</inst> 

我写了下面的XQuery/XPath的表达式:

doc('database/data.xml')/inst[ins/id='id_01']

这不会给想要的结果,但谁乐文件,就好像没有过滤条件会在那里。但如果我把ID所不存在的XML的文档,结果是空的。

我只是不知道这个说法有什么问题。

回答

1

你写的XPath的,

/inst[ins/id='id_01'] 

说,选择包含有一个子元素,其字符串值是"id_01"一个ins子元素inst根元素。由于您的XML的根确实符合这一标准,它被选中:

<inst> 
    <ins> 
    <id>id_01</id> 
    <pos>1</pos> 
    </ins> 
    <ins> 
    <id>id_02</id> 
    <pos>1</pos> 
    </ins> 
</inst> 

你也可以使用这个XPath,

/inst/ins[id='id_01'] 

仅选择这个XML,

<ins> 
    <id>id_01</id> 
    <pos>1</pos> 
</ins> 

然而,没有任何的XPath,你似乎想要做的是将选择根元素没有第二ins元素。原因是XPath是选择,而不是XML的转换。 。在你的XML没有inst元素可以选择缺少第二(id_02ins元素。如果您想要转换XML,请改为使用XSLT。

-1

你可以写东西喜欢 -

<inst>{doc('database/data.xml')/inst/ins[id eq "id_01"]}</inst>
的 “值比较” 操作符(EQ,LT等)的设计比较单一的价值观,所以最好使用 'EQ'