2017-10-17 125 views
0

我在查询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 =术语的领域元素的所有Textvalues并在LangSet归还如下showned:

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

我得到正确的价值观,但不unfortunatley在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 

我确定它并不那么困难,但我被困在文档中,我无法找到适合我的解决方案。

谢谢你的任何建议!

+0

有没有在你的输入没有'数据库/词典/ Concept'元素, “文档”拼写为小写“d”。 doc(“Sample.xml”)/ document/LangSet/Term/field'应该可以工作。 – potame

回答

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> 
+0

非常感谢你!这正是我需要的!太棒了!很棒很棒! – user1788114

+0

@ user1788114请在我们的[帮助中心](https://stackoverflow.com/help)查看[_我该怎么做当有人回答我的问题?_](https://stackoverflow.com/help/someone-answers) 。 – CiaPan

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> 
相关问题