假设我有以下代码段
<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"
将分别提供1
,1
,0
。
我通过计算其中一个案例中的孩子数来解决这个问题,但我仍然感到困惑,为什么会这样。
任何输入的坦克!
编辑:这是我一直在使用的代码:
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暗示误导性错别字!
答案 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
。