通过Xquery更改节点名称

时间:2017-12-26 08:24:43

标签: function xquery soa osb xquery-update

我正在尝试创建一个xquery,只要'CNode3'的子元素('CCNode1')为'CCValue1',就会将节点的名称从'CNode3'更改为'ChangedNode3'。

 While SqlDRDeweyCBL.Read()

        If SqlDRDeweyCBL("Id_Dewey_Subcat") = li.Value Then

            li.Selected = True
        Else

            li.Selected = False
        End If

    End While

这个特定场景没有得到很多在线帮助。我检查了下面的链接,但它将所有'CNode3'的名称更改为'ChangedNode3'。 PFB链接: http://www.xqueryfunctions.com/xq/functx_change-element-names-deep.html

1 个答案:

答案 0 :(得分:1)

functx:change-element-names-deep()函数仅评估元素名称。你需要更多的定制。

您可以在本地功能中使用typeswitch

declare function local:transform($nodes as node()*) as item()* {
    for $node in $nodes
    return 
        typeswitch($node)
            case text() return $node
            case comment() return $node
            case attribute() return $node
            case processing-instruction() return $node
            case element(CNode3) 
              return 
                if ($node[CCNode1 eq "CCValue1"]) then 
                  element ChangedNode3 {( $node/@*, local:transform($node/node()) )} 
                else 
                  element {name($node)} {($node/@*, local:transform($node/node()))}
            case element() 
              return element {name($node)} {($node/@*, local:transform($node/node()))}
            default return local:transform($node/node())
};

typeswitch transformation pattern的完整说明。