xQuery:使用'和'测试两个特定的孩子。

时间:2016-08-16 16:58:49

标签: conditional xquery

假设我有以下代码段

<persName>
    <forename>Gaius</forename>
    <surname>Iulius</surname>
    <addName>Caesar</addName>
</persName>

我需要像[surname], [forename]这样的结果,只有在必要时才能出现逗号。

在XSLT中,我只是使用

<xsl:value-of select="surname" />
<xsl:if test="surname and forename"><xsl:text>, </xsl:text></xsl:if>
<xsl:value-of select="forename" />

现在我天真地以为我可以将它转移到XQuery - 并且失败了。 我有点疑惑

if ($node/forename) then "1" else "0"
if ($node/surname) then "1" else "0"
if ($node/surname and $node/forename) then "1" else "0"

将分别提供110。 我通过计算其中一个案例中的孩子数来解决这个问题,但我仍然感到困惑,为什么会这样。

任何输入的坦克!

编辑:这是我一直在使用的代码:

declare function habe:shortName($node) {
    <span>{
        if ($node/tei:name) then $node/tei:name
        else 
            let $tr := if ($node/tei:surname and count($node/tei:forename)>0) then ", " else ""
            return concat($node/tei:surname, $tr, $node/tei:forename)
    }</span>
};

,如果给出上述代码段,则返回IuliusGaius

然后我尝试了上面的三个测试并得到了说明的结果。

我在eXist上这样做 - 也许他们的实现有问题?

编辑:感谢@MichaelKay和@joewiz暗示误导性错别字!

2 个答案:

答案 0 :(得分:2)

以下代码使用http://exist-db.org/exist/apps/eXide/index.html上的eXide返回预期结果cd c:\stock sqlcmd -i testquery.sql -S localhost -U User -P password -o testresults.txt @find /c /i "0 rows" "C:\stock\testresults.txt" > NUL if %ERRORLEVEL% EQU 1 ( pause ) else ( copy c:\stock\testresults.txt \\printserver\share) pause sqlcmd -i ems_update.sql -S localhost -U User -P password

(1, 1, 1)

答案 1 :(得分:1)

原始问题的一个解决方案(如果同时存在', 'forename,则添加surname)是使用string-join($strs as xs:string*, $joiner as xs:string)而不是concat($string as xs:string[...])

let $name :=
    <persName>
        <forename>Gaius</forename>
        <surname>Iulius</surname>
        <addName>Caesar</addName>
    </persName>
return string-join(($name/surname, $name/forename), ', ')

返回Iulius, Gaius

您还可以直接在布尔表达式中检查节点是否存在:

let $name :=
    <persName>
        <forename>Gaius</forename>
        <surname>Iulius</surname>
        <addName>Caesar</addName>
    </persName>
return (
  $name/surname and $name/forename,
  $name/surname and $name/foo
)

返回true false