2016-10-05 3 views
1
<xs:attributeGroup name="personattr"> 
    <xs:attribute name="attr1" type="xs:string"/> 
    <xs:attribute name="attr2" type="xs:integer"/> 
    <xs:attributeGroup ref="personattr2"> 
</xs:attributeGroup> 

<xs:attributeGroup name="personattr2"> 
    <xs:attribute name="attr12" type="xs:string"/> 
    <xs:attribute name="attr22" type="xs:integer"/> 
    <xs:attributeGroup ref="personattr3"> 
</xs:attributeGroup> 

<xs:attributeGroup name="personattr3"> 
    <xs:attribute name="attr13" type="xs:string"/> 
    <xs:attribute name="attr23" type="xs:integer"/> 
</xs:attributeGroup> 

<xs:attributeGroup name="personattr4"> 
    <xs:attribute name="attr14" type="xs:string"/> 
    <xs:attribute name="attr24" type="xs:integer"/> 
</xs:attributeGroup> 

上記のサンプルXSDファイルでは、特定のattributeGroupからすべてのネストされたattributeGroupをどのように抽出するのですか? personattrにはpersonattr2があります。 personattr2の内部には、personattr3があります。結果にはpersonattr4を含めないでください。XQuery:すべてのネストされたxs:attributeGroupを抽出する

あなたは簡単に再帰 ユーザー定義関数で参照子グループに降順でそれを行うことができます

答えて

1

:あなたがしたい場合

personattr 
personattr2 
personattr3 

declare function local:groups-below($groups, $name) { 
    $name, 
    for $ref in $groups[@name = $name]/xs:attributeGroup/@ref/string() 
    return local:groups-below($groups, $ref) 
}; 

local:groups-below($all-groups, 'personattr') 

これは、以下のグループ名を返します。代わりに要素全体を返します。

declare function local:groups-below($groups, $name) { 
    let $group := $groups[@name = $name] 
    return (
    $group, 
    for $ref in $group/xs:attributeGroup/@ref/string() 
    return local:groups-below($groups, $ref) 
) 
}; 

local:groups-below($all-groups, 'personattr') 

これは、次のシーケンスを返します: `グループ-以下(// attributeGroupの 'personattr'):

<xs:attributeGroup xmlns:xs="http://www.w3.org/2001/XMLSchema" name="personattr"> 
    <xs:attribute name="attr1" type="xs:string"/> 
    <xs:attribute name="attr2" type="xs:integer"/> 
    <xs:attributeGroup ref="personattr2"/> 
</xs:attributeGroup>, 
<xs:attributeGroup xmlns:xs="http://www.w3.org/2001/XMLSchema" name="personattr2"> 
    <xs:attribute name="attr12" type="xs:string"/> 
    <xs:attribute name="attr22" type="xs:integer"/> 
    <xs:attributeGroup ref="personattr3"/> 
</xs:attributeGroup>, 
<xs:attributeGroup xmlns:xs="http://www.w3.org/2001/XMLSchema" name="personattr3"> 
    <xs:attribute name="attr13" type="xs:string"/> 
    <xs:attribute name="attr23" type="xs:integer"/> 
</xs:attributeGroup> 
+0

は、最後の行は'ローカルではないでしょうか? – Bouke

+1

質問で与えられた入力は有効なXMLノードではないので、私はそれがある変数(ここでは '$ all-groups')に束縛されていると仮定しました。 '@ref'属性を持つものではなく、トップレベルの' xs:attributeGroup'要素だけが必要です。しかし、* XSD *文書全体がコンテキスト項目である場合、 'local:groups-below(// xs:attributeGroup、 'personattr')'は正しい結果を返します。 –

+0

実際には、すべてのxs:attributeGroupノードがシーケンスとして返されます。この場合、personattr、personattr2、personattr3という名前のattributeGroupがシーケンス内にあります。とにかく私はあなたにクレジットを与えます –

関連する問題