2014-09-12 18 views
1

Мне нужно, чтобы вернуть все XML-узлов, чьи атрибуты ID матча между <Settings></Settings> и <Profile></Profile> и чей <Setting/> узел имеет Value атрибут true. Пример моей структуры XML находится ниже:Matching и возвращающие конкретные узлы 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/> is true, поэтому его необходимо вернуть. Должен признать, что я понятия не имею, как сделать совпадение между идентификаторами. Любая помощь, пожалуйста?

ответ

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! –

Смежные вопросы