2012-07-24 101 views
0

例如,我需要我的结果是这样的形式如何更改XPath查询返回的节点值?

<result> 
    <French> 
    <country>country-name</country> 
    <country>country-name</country> 
    ... 
    </French> 
    <German> 
    <country>country-name</country> 
    <country>country-name</country> 
    ... 
    </German> 
</result> 

,但目前,我的结果是形式

<language percentage="100">German</language> 
    <language percentage="32">French</language> 
    <language percentage="1">German</language> 
    <language percentage="100">French</language> 
    <language percentage="100">French</language> 
    <language percentage="100">German</language> 
    <language percentage="99">French</language> 
    <language percentage="100">French</language> 
    <language percentage="10">French</language> 
    <language percentage="32">German</language> 
    <language percentage="100">French</language> 
    <language percentage="18">French</language> 
    <language percentage="65">German</language> 

。这是我的查询:

doc("countries.xml")//country/language[contains(text(), "French") or contains(text(), "German")] 

的原始数据如下所示:

<country name="Afghanistan" population="22664136" area="647500"> 
    <language percentage="11">Turkic</language> 
    <language percentage="35">Pashtu</language> 
    <language percentage="50">Afghan Persian</language> 
</country> 

回答

1

使用XQuery,这将解决这个问题:

<result> 
    { 
    for $language in distinct-values(doc("countries.xml")//language) 
    return 
     element {translate($language, " ", "_")} 
     { 
     for $country in doc("countries.xml")//country[language = $language] 
     return element country {string($country/@name)} 
     } 
    } 
    </result> 

请注意语言不能马上用作标记的名称,因为它包含空格(如“阿富汗波斯语”) - 因此,调用translate

如果你只是想你指定的语言,通过

for $language in ("French", "German") 
+0

它工作完美。 – 2012-07-24 20:54:57

0

您可以使用LinQ到XML/Object,使用GroupBy创建查询并使用XMLWriter重写XML,或者一起使用XML StyleSheet转换和xml/xsl。

0

的XPath更换for子句只能选择输入文档中的节点。如果要构建新的输出文档,可以使用XSLT或XQuery执行此操作,两者均使用XPath从输入中选择节点,并添加工具以在输出中构造新节点。