1

我有以下 XML:

<RULES>
    <TRAP name="trap1" oid=".1.2.3">
      <VAR_LIST>
        <VAR name="var1" value=".1.2.3.1"/>
        <VAR name="var2" value=".1.2.3.2"/>
      </VAR_LIST>
    </TRAP>
    <TRAP name="trap2" oid=".1.2.4">
        ...
    </TRAP>
    ...
</RULES>

我想生成扁平化摘要,所以我按如下方式遍历它:

for $trap in /RULES/TRAP
    for $var in $rule/VAR_LIST/VAR
       return (opening-tag-declaration($trap), opening-tag-declaration($var), "&#10;")

我想得到以下输出,但我不知道如何只提取标签的开始声明......

<TRAP name="trap1" oid=".1.2.3> <VAR name="var1" value=".1.2.3.1"/>
<TRAP name="trap1" oid=".1.2.3> <VAR name="var2" value=".1.2.3.2"/>
<TRAP name="trap2" oid=".1.2.4> ...
...
4

2 回答 2

2

这是定义的一种方法opening-tag-declaration(改编自FunctX 库中的此函数):

declare namespace example = "http://example.com";
declare function example:opening-tag-declaration 
    ( $elements as element()* ) as element()* {

    for $element in $elements
        return element
            {node-name($element)}
            {$element/@* }
};

它在结果元素中包括元素名称及其属性,但不包括子节点。使用 w3schools 的books.xml示例文件进行演示。

于 2013-03-08T15:01:59.423 回答
0

这是我在mgibsonbr回答之前解决此问题的自定义方法:

declare function local:tag($node as node()) as xs:string {
    concat(substring-before(fn:serialize($node), ">"), ">")
};
于 2013-03-09T13:07:58.283 回答