使用特殊属性值查询所有节点

时间:2017-10-17 12:49:22

标签: attributes xquery

我在查询XML结构时遇到问题。

这是文件:

<?xml version="1.0" encoding="UTF-8"?>
<document>
<LangSet id="1031">
    <field id="Language">1031</field>
    <field id="PrimaryLanguage">7</field>
    <Term id="18">
        <field id="CreatedBy">dot_Termservice</field>
        <field id="CreatedOn">20060905T170414Z</field>
        <field id="CreatedOnUTC">20060905T150414Z</field>
        <field id="CreatedOrUpdatedBy">dot_Termservice</field>
        <field id="CreatedOrUpdatedOn">20080107T141350Z</field>
        <field id="CreatedOrUpdatedOnUTC">20080107T121350Z</field>
        <field id="Status">Negativterm.Kunden-orientiert;Negativterm.Technik-orientiert</field>
        <field id="Term">Innenpersenning</field>
        <field id="TermType">MainTerm</field>
        <field id="UpdatedBy">dot_Termservice</field>
        <field id="UpdatedOn">20080107T141350Z</field>
        <field id="UpdatedOnUTC">20080107T121350Z</field>
        <field id="UserId">11817</field>
    </Term>
    <Term id="19">
        <field id="CreatedBy">dot_Termservice</field>
        <field id="CreatedOn">20020626T120555Z</field>
        <field id="CreatedOnUTC">20020626T100555Z</field>
        <field id="CreatedOrUpdatedBy">dot_Termservice</field>
        <field id="CreatedOrUpdatedOn">20020626T120555Z</field>
        <field id="CreatedOrUpdatedOnUTC">20020626T100555Z</field>
        <field id="Status">Vorzugsterm.Kunden-orientiert;Vorzugsterm.Technik-orientiert</field>
        <field id="Term">Persenning</field>
        <field id="TermType">MainTerm</field>
        <field id="UserId">18088</field>
    </Term>
    <Term id="20">
        <field id="CreatedBy">dot_Termservice</field>
        <field id="CreatedOn">20011105T140407Z</field>
        <field id="CreatedOnUTC">20011105T120407Z</field>
        <field id="CreatedOrUpdatedBy">dot_Termservice</field>
        <field id="CreatedOrUpdatedOn">20080107T141350Z</field>
        <field id="CreatedOrUpdatedOnUTC">20080107T121350Z</field>
        <field id="Status">Negativterm.Kunden-orientiert;Negativterm.Technik-orientiert</field>
        <field id="Term">Verdeckabdeckung</field>
        <field id="TermType">MainTerm</field>
        <field id="UpdatedBy">dot_Termservice</field>
        <field id="UpdatedOn">20080107T141350Z</field>
        <field id="UpdatedOnUTC">20080107T121350Z</field>
        <field id="UserId">32287</field>
    </Term>
</LangSet>
<LangSet id="1031">
    <field id="Language">1031</field>
    <field id="PrimaryLanguage">7</field>
    <Term id="8">
        <field id="CreatedBy">dot_Termservice</field>
        <field id="CreatedOn">20060905T170414Z</field>
        <field id="CreatedOnUTC">20060905T150414Z</field>
        <field id="CreatedOrUpdatedBy">dot_Termservice</field>
        <field id="CreatedOrUpdatedOn">20070711T153241Z</field>
        <field id="CreatedOrUpdatedOnUTC">20070711T133241Z</field>
        <field id="Status">Vorzugsterm.Kunden-orientiert;Vorzugsterm.Technik-orientiert</field>
        <field id="Term">Innenrad</field>
        <field id="TermType">MainTerm</field>
        <field id="UpdatedBy">dot_Termservice</field>
        <field id="UpdatedOn">20070711T153241Z</field>
        <field id="UpdatedOnUTC">20070711T133241Z</field>
        <field id="UserId">11818</field>
    </Term>
</LangSet>
</document>

我想要做的就是获取具有属性id = Term的字段元素的所有Textvalues,并将它们返回到LangSet中,如下所示:

    <LangSet> <field id="Term">Innenpersenning</field> <field
    id="Term">Persenning</field> <field id="Term">Verdeckabdeckung</field>
     </LangSet>

     <LangSet>
<field id="Term">Innenrad</field>
</LangSet>

     <LangSet>
<field id="Term">Raumakustik</field>
</LangSet>

     <LangSet> 
<field id="Term">Fahrgastraumbeleuchtung</field> <field
     id="Term">IB</field> <field id="Term">Innenbeleuchtung</field> <field
     id="Term">Innenraumbeleuchtung</field> 
</LangSet>

我得到了正确的值,但不幸的是不在Langset节点中:

xquery version "1.0";

declare boundary-space strip;

declare namespace xs="http://www.w3.org/2001/XMLSchema";
for $x in doc("Sample.xml")/Document/Database/Dictionary/Concept/LangSet/Term//field
where $x/@id="Term"

return $x

我确信这不是那么困难,但我已经陷入了文档困境,我无法找到适合我的解决方案。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:0)

如果您决定从文档中返回<LangSet>元素,其中包含适当的<field>后代元素,则它们也将包含其他所有后代。

如果我理解你想要的东西,你需要动态创建一些半克隆元素,部分反映你的输入文档被过滤并返回它们。

扫描LangSet - s并测试每个所需的后代。如果找到,请创建适当的输出元素:

let $doc := doc("Sample.xml")
for $langset in $doc/document/LangSet
let $fields := $langset/descendant::field[@id = 'Term']
where exists($fields)
return
    <LangSet>
    {
        for $field in $fields return
            <field id='Term'>{string($field)}</field>
    }
    </LangSet>

答案 1 :(得分:0)

您可以采用自上而下的方法解决此问题,例如CiaPan's answer或自下而上的方法。 基于xml示例,您提供的解决方案可能是:

顶向下

let $document := doc("langset.xml")/*
for $langset in $document/LangSet
let $fields := $langset//field[@id = 'Term']
return
    <LangSet>
    { $fields }
    </LangSet>

自下而上

let $document := doc("langset.xml")/*
for $field in $document//field[@id = 'Term']
group by $langset := $field/ancestor::LangSet
order by $langset descending
return
    <LangSet>
    { $field }
    </LangSet>