![](/img/trans.png)
[英]How do I create an XSLT to merge two XML documents based on a sibling node text matching between the two?
[英]How do I find the text of a sibling xml node based on the text value in its sibling node?
鑒於:
<param>
<data>
<value><string>ErrorCode</string></value>
<value><string>200</string></value>
</data>
<data>
<value><string>Desc</string></value>
<value><string>Age group</string></value>
</data>
</param>
我該如何構造一個xpath來返回文本值為200的節點/param/data/value/string
? 基本上我只想搜索同級./value/string
文本之一包含ErrorCode
同級value
元素?
您應該使用以下XPath表達式:
/param/data/value/string[../preceding-sibling::value[string='ErrorCode']|../following-sibling::value[string='ErrorCode']]
如果值的順序始終相同,則可以刪除並運算符並僅使用謂詞的一部分。
對於那些感興趣的人,我有非常相似的需求,並且必須做些微的不同。
如果同一節點內的兄弟姐妹基於另一個兄弟姐妹,則需要獲取值。 因此,在下面的示例中,我需要根據特定的gameId獲取抽獎編號
XML:
<InitResponse>
<LottoToken>908ec70b308adf10d04db1478ef9b01b</LottoToken>
<GameInfoList>
<GameInfo>
<Draw>
<gameId>L649</gameId>
<draw>3035</draw>
</Draw>
</GameInfo>
<GameInfo>
<Draw>
<gameId>BC49</gameId>
<draw>2199</draw>
</Draw>
</GameInfo>
</GameInfoList>
</InitResponse>
我需要使用以下語法。 它可以在多個在線xPath評估器中使用,但是我在C#中遇到了麻煩,不得不使用其他方法。
/InitResponse/GameInfoList/GameInfo/Draw/draw[preceding-sibling::gameId='L649']
C#版本:
string s = @"
<param>
<data>
<value><string>ErrorCode</string></value>
<value><string>200</string></value>
</data>
<data>
<value><string>Desc</string></value>
<value><string>Age group</string></value>
</data>
</param>";
XDocument xdoc = XDocument.Parse(s);
foreach (var elem in xdoc.XPathSelectElements("/param/data/value[string='ErrorCode']"))
{
XName value = XName.Get("value");
foreach (var res in elem.ElementsBeforeSelf(value).Union(elem.ElementsAfterSelf(value)).Select(el => el.XPathSelectElement("string").Value))
Console.WriteLine(res);
}
嘗試以下Xpath
//param/data/value[string='ErrorCode']/following-sibling::value/string | //param/data/value[string='ErrorCode']/preceding-sibling::value/string
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.