我根据某些条件使用XQuery从XML中选择节点列表。结果是一个节点的列表,但我只想返回它们中的一个(第一个或最后一个)。
首先我使用XPath来选择一些元素,然后我想过滤掉任何不包含值的元素(即。是空的)。为此,我使用functx:if-not-empty函数。我得到的是一系列项目,我只需要其中一项。到目前为止,这是我的代码:
declare function xf:createHeader($var as element(sgi:inputType))
{
<ns0:Header>
<ns0:MSG_TYPE>MESSAGETYPE</ns0:MSG_TYPE>
<ns0:MSG_NAMESPACE>{ fn:namespace-uri($var) }</ns0:MSG_NAMESPACE>
<ns0:UNIT>
{
let $x := $var/DataArea/OrganisationalUnit[@type = "Responsible"]/PartnerID[@agencyID = "TT4"]
for $y in $x
where functx:if-not-empty($y)
return data($y)
}
</ns0:UNIT>
</ns0:Header>
};
答案 0 :(得分:1)
您正在寻找的是一个谓词。您可以将for语句包装在谓词中,并使用[fn:last()]
请求第一个[1]或最后一个所以它看起来像
<ns0:UNIT>
{
let $x := $var/DataArea/OrganisationalUnit[@type = "Responsible"]/PartnerID[@agencyID = "TT4"]
return
(
for $y in $x
where functx:if-not-empty($y)
return data($y)
)[fn:position() = (1,fn:last())]
}
</ns0:UNIT>