Соответствие и возврат определенных узлов XML

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

1 ответ

Решение

Когда вы имеете дело с 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() дает имя текущего узла.

Другие вопросы по тегам