我试图让一些代码工作,扫描模板的XPath表达式,并用结果替换Xpath . 其中大部分都相当简单,但我遇到一个问题,即获取xpath表达式,该表达式根据当前上下文的不同值查找值 .
我的代码的简化版本;
//Iterates through all Posting Opjects
XPathNodeIterator loopIter = payload.getXpathList("//FolioInfo/Postings[NetAmount>10]");
foreach (XPathNavigator val in loopIter)
{
string xPathLookup = "//TrxInfo[Code=TrxCode]/Description" //Returns no result
//string xPathLookup = "//TrxInfo[Code=1]/Description" //Returns "Desc 2"
//string xPathLookup = "NetAmount" //Works Correctly
XPathExpression rgxLookup = XPathExpression.Compile(xPathLookup);
XmlNamespaceManager manager = new XmlNamespaceManager(val.NameTable);
rgxLookup.SetContext(manager);
string tmpText = val.Evaluate(rgxLookup); //Simplified - Changes depending on ReturnType
//Do stuff
}
“// TrxInfo [Code = TrxCode] / Description”的表达式是我遇到问题的那个 . 我可以用“// TrxInfo [Code = 1] / Description”或“// TrxInfo [Code = // FolioInfo / Postings [1] / TrxCode] / Description”替换它,它会起作用,但我无法得到它识别当前上下文只使用元素名称 .
我也尝试了“Code = .TrxCode”,文档建议应该可以使用,但没有乐趣 .
对于背景,其想法是用户可以根据需要配置显示作品集发布的模板 . 有过滤Postings列表的功能,所以我无法使用position()使用For循环遍历所有Postings .
简化的XML
<FolioInfo>
<TrxInfo>
<Description>Desc 2</Description>
<Code>1</Code>
</TrxInfo>
<TrxInfo>
<Description>Desc 1</Description>
<Code>2</Code>
</TrxInfo>
<Postings>
<TrxDate>2016-09-19</TrxDate>
<TranActionId>123</TranActionId>
<Quantity>1</Quantity>
<NetAmount>25</NetAmount>
<TrxCode>1</TrxCode>
</Postings>
<Postings>
<TrxDate>2016-09-20</TrxDate>
<TranActionId>321</TranActionId>
<Quantity>2</Quantity>
<NetAmount>30</NetAmount>
<TrxCode>2</TrxCode>
</Postings>
</FolioInfo>