XQuery:使用 if 语句时删除 xml 声明

问题描述 投票:0回答:1

考虑以下三个陈述。

1:

XMLSERIALIZE(DOCUMENT XMLQUERY(q'^
                                copy $i := $doc modify (
                                    for $j in $i/tdfmt/text()[1]
                                return 
                                    insert node ( $text, $br, '
' ) before $j
                                )
                                return $i
                               ^'
        PASSING
            XMLTYPE(OIT.INFTXT)  AS "doc",
            LENGTH(EXTRACTVALUE(XMLTYPE(OIT.INFTXT),'tdfmt/text()[1]')) AS "len",
            'NEW TEXT TO INSERT' AS "text",
            XMLTYPE('<br/>')            AS "br"
        RETURNING CONTENT)  AS CLOB INDENT SIZE=4 )
        AS NEW_INFTXT_A

2:

XMLSERIALIZE(DOCUMENT XMLQUERY(q'^
                                copy $i := $doc modify (
                                    for $j in $i/*
                                return 
                                    insert node ( $text, $br, '&#xa;' ) into $j
                                )
                                return $i
                               ^'
        PASSING
            XMLTYPE(OIT.INFTXT)  AS "doc",
            LENGTH(EXTRACTVALUE(XMLTYPE(OIT.INFTXT),'tdfmt/text()[1]')) AS "len",
            'NEW TEXT TO INSERT' AS "text",
            XMLTYPE('<br/>')            AS "br"
        RETURNING CONTENT)  AS CLOB INDENT SIZE=4 )
        AS NEW_INFTXT_B

3:

XMLSERIALIZE(DOCUMENT XMLQUERY(q'^                                      
                                if ($len>0) 
                                then    
                                    copy $i := $doc modify (
                                        for $j in $i/tdfmt/text()[1]
                                    return 
                                        insert node ( $text, $br, '&#xa;' ) before $j
                                    )
                                    return $i
                                else    
                                    copy $i := $doc modify (
                                        for $j in $i/*
                                    return 
                                        insert node ( $text, $br, '&#xa;' ) into $j
                                    )
                                    return $i
                               ^'
        PASSING
            XMLTYPE(OIT.INFTXT)  AS "doc",
            LENGTH(EXTRACTVALUE(XMLTYPE(OIT.INFTXT),'tdfmt/text()[1]')) AS "len",
            'NEW TEXT TO INSERT' AS "text",
            XMLTYPE('<br/>')            AS "br"
        RETURNING CONTENT)  AS CLOB INDENT SIZE=4 )
        AS NEW_INFTXT1

这个想法是根据节点的长度在 1 和 2 之间切换。 在 3 的输出中,我注意到 xml 声明

<?xml version="1.0"?>
被省略,而 1 和 2 则存在。知道为什么添加
if then else
声明会导致这种行为,以及我应该采取什么措施来防止声明表被删除。

xml oracle plsql xquery-sql
1个回答
0
投票

不确定为什么会产生这种效果,但您可以通过将

if
放在
modify
内来避免这种情况:

SELECT XMLSERIALIZE(DOCUMENT XMLQUERY(q'^                                      
                                copy $i := $doc modify (
                                    if ($len>0) 
                                    then    
                                        for $j in $i/tdfmt/text()[1]
                                        return 
                                        insert node ( $text, $br, '&#xa;' ) before $j
                                    else    
                                        for $j in $i/*
                                        return 
                                        insert node ( $text, $br, '&#xa;' ) into $j
                                )
                                return $i
                               ^'
        PASSING
            XMLTYPE(OIT.INFTXT)  AS "doc",
            LENGTH(EXTRACTVALUE(XMLTYPE(OIT.INFTXT),'tdfmt/text()[1]')) AS "len",
            'NEW TEXT TO INSERT' AS "text",
            XMLTYPE('<br/>')            AS "br"
        RETURNING CONTENT)  AS CLOB INDENT SIZE=4 )
        AS NEW_INFTXT1
FROM OIT
NEW_INFTXT1

要插入新文本

31 05 2022 Rico Strydom

Op verzoek(zie电子邮件)保证overplaatsen....

    

超额预订信用证:
银行代码:1171
T.L .V.:VERP。 NL99BANK999999999999
T.G.V.:RC NL00BANK000000000000

BEDRAG:欧元9999999
BESCHRIJVING:Vrijgave verpandingcreditgelden AA98987987987 ivm overzetten zekerheid naar BGF

    



要插入新文本


小提琴

© www.soinside.com 2019 - 2024. All rights reserved.