2014-09-12 55 views
1

我需要返回ID属性匹配的所有XML节点,它们的编号为<Settings></Settings><Profile></Profile>,而其<Setting/>节点的属性为true。 我的XML结构的例子被发现下面:匹配并返回特定的XML节点

<HBDI> <Settings> <Setting ID="PreferenceCode" Visible="true"/> <Setting ID="SequenceCode" Visible="true"/> <Setting ID="QuadrantScores" Visible="false"/> <Setting ID="AdjectivePairs" Visible="false"/> <Setting ID="ModeScores" Visible="true"/> <Setting ID="Graph" Visible="true"/> </Settings> <Profile> <PreferenceCode ID="PreferenceCode">3332</PreferenceCode> <SequenceCode ID="SequenceCode">DCAB</SequenceCode> <Graph ID="Graph">Graph.jpg</Graph> <QuadrantScores ID="QuadrantScores"> <QuadrantScore Name="A" Value="3" /> <QuadrantScore Name="B" Value="3" /> <QuadrantScore Name="C" Value="23" /> <QuadrantScore Name="D" Value="46" /> </QuadrantScores> <AdjectivePairs ID="AdjectivePairs"> <AdjectivePair Name="A" Value="4" /> <AdjectivePair Name="B" Value="7" /> <AdjectivePair Name="C" Value="9" /> <AdjectivePair Name="D" Value="10" /> </AdjectivePairs> <ModeScores ID="ModeScores"> <ModeScore Name="Lt" Value="34" /> <ModeScore Name="Rt" Value="54" /> <ModeScore Name="Upr" Value="3" /> <ModeScore Name="Lwr" Value="24" /> </ModeScores> </Profile> </HBDI>

所以我想实现的是检索以下XML:

<HBDI> <PreferenceCode ID="PreferenceCode">3332</PreferenceCode> <SequenceCode ID="SequenceCode">DCAB</SequenceCode> <Graph ID="Graph">Graph.jpg</Graph> <ModeScores ID="ModeScores"> <ModeScore Name="Lt" Value="34" /> <ModeScore Name="Rt" Value="54" /> <ModeScore Name="Upr" Value="3" /> <ModeScore Name="Lwr" Value="24" /> </ModeScores> </HBDI>

所以,在ID="PreferenceCode"的情况下,它的相应Visible属性<Settings/>true,因此需要返回。我必须承认,我不知道如何进行ID之间的匹配。请帮忙吗?

回答

2

当你正在处理XML,使用XQuery:

DECLARE @MyXML xml = ' 
<HBDI> 
    <Settings> 
     <Setting ID="PreferenceCode" Visible="true"/> 
     <Setting ID="SequenceCode" Visible="true"/> 
     <Setting ID="QuadrantScores" Visible="false"/> 
     <Setting ID="AdjectivePairs" Visible="false"/> 
     <Setting ID="ModeScores" Visible="true"/> 
     <Setting ID="Graph" Visible="true"/> 
    </Settings> 
    <Profile> 
     <PreferenceCode ID="PreferenceCode">3332</PreferenceCode> 
     <SequenceCode ID="SequenceCode">DCAB</SequenceCode> 
     <Graph ID="Graph">Graph.jpg</Graph> 
     <QuadrantScores ID="QuadrantScores"> 
      <QuadrantScore Name="A" Value="3" /> 
      <QuadrantScore Name="B" Value="3" /> 
      <QuadrantScore Name="C" Value="23" /> 
      <QuadrantScore Name="D" Value="46" /> 
     </QuadrantScores> 
     <AdjectivePairs ID="AdjectivePairs"> 
      <AdjectivePair Name="A" Value="4" /> 
      <AdjectivePair Name="B" Value="7" /> 
      <AdjectivePair Name="C" Value="9" /> 
      <AdjectivePair Name="D" Value="10" /> 
     </AdjectivePairs> 
     <ModeScores ID="ModeScores"> 
      <ModeScore Name="Lt" Value="34" /> 
      <ModeScore Name="Rt" Value="54" /> 
      <ModeScore Name="Upr" Value="3" /> 
      <ModeScore Name="Lwr" Value="24" /> 
     </ModeScores> 
    </Profile> 
</HBDI>' 

SELECT  @MyXML.query(' 
<HDBI> { 
    let $settings := /HBDI/Settings 
    for $element in /HBDI/Profile/* 
     where $settings/Setting[@ID = local-name($element) and @Visible = "true"] 
     return $element 
} </HDBI> 
') 

XQuery的遍历<Profile>标签的每个子节点并检查它是否被设置为@Visible = "true"<Settings>节点。 local-name()给出了当前节点的名称。

+0

谢谢你的答案Zoff! – 2014-09-14 15:08:01