请放轻松,这是我第一次使用XPath 2.0
:)
给出以下代码:
import net.sf.saxon.expr.Expression;
import net.sf.saxon.expr.StaticContext;
import net.sf.saxon.functions.CompileTimeFunction;
import net.sf.saxon.sort.Reverser;
import net.sf.saxon.trans.XPathException;
public class MyReverse extends CompileTimeFunction {
public Expression simplify(StaticContext env) throws XPathException {
Reverser a = new Reverser(argument[0]);
return a.simplify(env);
}
}
我想颠倒查询:
String query = "inventory/book/chapter[3]/preceding-sibling::chapter//title";
Object myQuery= xpath.evaluate(query,doc,XPathConstants.NODESET);
我的XML文件(如果您愿意,我可以附加XML文件,如果确实需要,请说明!)
现在根据我的理解,如果我这样做:
MyReverse rev = new MyReverse();
然后如果我尝试使用这样的方法evaluateAsString
:rev.evaluateAsString(arg0)
那么arg0
应该是XPathContext
个对象。
如何使用上述方法查询?
问候
编辑1:
亲爱的@Dimitre Novatchev先生写的示例中,需要的是节点X
中的所有节点到文档的上方。
但是,如果其中一个X's
兄弟姐妹有孩子,那么我需要介绍兄弟姐妹,然后才能介绍他的兄弟姐妹(之后再转移到下一个兄弟姐妹身上,同样的再次),不兄弟姐妹的孩子只有那时 - 兄弟姐妹。
我很抱歉没有提及&先前解释了这个
再次感谢:)
答案 0 :(得分:2)
只需评估此XPath 2.0表达式:
reverse(/inventory/book/chapter[3]/preceding-sibling::chapter//title)
以下是基于XSLT的验证:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:sequence select=
"reverse(/inventory/book/chapter[3]/preceding-sibling::chapter//title)
"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于以下XML文档(取自上一个问题):
<inventory>
<book num="myBook1">
<title>Lindsy Boxer</title>
<author>James Patterson</author>
<publisher>LittleBig</publisher>
<price>18.21</price>
<chapter>
<title>Alex Cross Is Back - Chapter A</title>
<paragraph>
This is the
<emph>first</emph> paragraph.
<image file="alexCrossImage.gif"/>
afetr image...
</paragraph>
<paragraph>
This is the
<emph>second</emph> paragraph.
<image file="alexCrossImageAnother.gif"/>
afetr image...
</paragraph>
</chapter>
<chapter>
<title>Along Came A Spider - Chapter B</title>
<section>
<title>Along Came A Spider - Chapter B - section 1</title>
<paragraph>
This is the
<emph>first</emph>paragraph for chapter TWO section ONE.
<image file="Chapter_B_firstParagraphImage.gif"/>
afetr image...
</paragraph>
<paragraph>
This is the
<emph>second</emph> paragraph for chapter TWO section ONE.
<image file="Chapter_B_secondParagraphImage.gif"/>
afetr image...
</paragraph>
</section>
</chapter>
<chapter>
<title>Chapter C</title>
<paragraph>
This chapter has no images and only one paragraph
</paragraph>
</chapter>
</book>
<book num="myBook2">
<title>Jack Reacher Series</title>
<author>Lee Child</author>
<author>Jonny White</author>
<publisher>Pocket</publisher>
<price>5.99</price>
<chapter>
<title>Jack Reacher - Chapter ONE</title>
</chapter>
<chapter>
<title>Jack Reacher - Chapter TWO</title>
<paragraph>
This is the
<emph>second</emph> paragraph of SECOND book chapter TWO.
<image file="Jack_Reacher_Picture_Top_Sniper_US_Army.gif"/>
afetr image...
</paragraph>
</chapter>
</book>
<book num="myBook3">
<title>Alex Cross - Double Cross</title>
<author>James Patterson</author>
<publisher>Spectra</publisher>
<price>17.30</price>
<chapter>
<title>Alex Cross - Double Cross - Chapter A</title>
</chapter>
</book>
</inventory>
评估上述XPath表达式,并将生成的节点序列复制到输出中:
<title>Along Came A Spider - Chapter B - section 1</title>
<title>Along Came A Spider - Chapter B</title>
<title>Alex Cross Is Back - Chapter A</title>
正如我们所看到的,序列包含所需元素,并按反向文档顺序 - 完全按照要求。
至于如何使用Saxon 9.x评估XPath表达式,请阅读相应的文档:http://www.saxonica.com/documentation/xpath-api/s9api-xpath.xml,其中包含指向完全正常工作的代码示例的指针。
<强>更新强>:
在评论中,OP表示他需要反向文档顺序中的chapter
元素,但是它们的标题元素按文档顺序排列。
为此,请使用:
reverse(/inventory/book/chapter[3]/preceding-sibling::chapter)//title
答案 1 :(得分:1)
你正在摆弄内部撒克逊实施课程,你不应该使用它们,而你显然不明白。您应该在XPath表达式中而不是在调用Java代码中进行所需的工作(颠倒一组节点的顺序)。