XPath的ID()我有以下XML文档:替代在.NET
<text xmlns:its="http://www.w3.org/2005/11/its" >
<its:rules version="2.0">
<its:termRule selector="//term" term="yes" termInfoPointer="id(@def)"/>
</its:rules>
<p>We may define <term def="TDPV">discoursal point of view</term>
as <gloss xml:id="TDPV">the relationship, expressed through discourse
structure, between the implied author or some other addresser,
and the fiction.</gloss>
</p>
</text>
termInfoPointer
是XPath表达式,它指向<gloss xml:id="TDPV">
元件。
我使用LINQ-to-XML来选择它。
XElement term = ...;
object value = term.XPathEvaluate("id(@def)");
我得到以下异常:System.NotSupportedException: This XPathNavigator does not support IDs.
,所以我试图与其他表达式替换id()
我无法找到一个解决这个问题:
//*[@xml:id='TDPV'] // works, but I need to use @def
//*[@xml:[email protected]]
//*[@xml:[email protected]/text()]
//*[@xml:id=self::node()/@def/text()]
但这些作品。
有没有办法实现id()
或用另一个表达式替换它?
我宁愿一个解决方案/解决方法,不涉及用另一个表达式替换id()
,因为这个表达式可能像id(@def) | id(//*[@attr="(id(@abc()))))))"])
那样复杂。
如果源XML文档具有DTD w,那么'id()'函数才能正常工作第i个被定义为ID的元素 - 在任何兼容的XPath实现中,没有这样的DTD,都不希望id()函数按需要进行评估。如果满足这个先决条件,则可以尝试将XDocument转换为普通的XMLDocument(或XpathNavigator)并使用'SelectNodes()'(或'Evaluate()')方法。 – 2013-02-21 15:39:24
下面是一个在Java中工作的解决方法:http://lists.w3.org/Archives/Public/public-multilingualweb-lt-tests/2013Jan/0064.html – mak 2013-02-24 18:07:14
mak,所提到的java解决方法在您的情况下不起作用。您需要编写一个评估方法,该方法接受一个字符串,表示一个XPath表达式并对其进行评估。您将使用此方法生成的结果来构造最终的XPath表达式,该表达式将选择“id”属性具有该值的元素。 – 2013-02-24 18:29:25