2

お手柔らかにお願いします、これを使うのは初めてです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)arg0XPathContext

上記の方法でクエリを使用するにはどうすればよいですか?

よろしく

編集1:

親愛なる @Dimitre Novatchev 氏が書いた例では、必要なのは node からXドキュメントの上側までのすべてのノードです。

ただし、X's兄弟の 1 人に子供がいる場合、兄弟を提示する必要があり、その兄弟の子供だけを提示する必要があります (その後、次の兄弟に移動し、同じことを繰り返します) 兄弟 & その時だけ - 兄弟 .

先にこれに言及して説明しなかったことをお詫びします

再度、感謝します :)

4

2 に答える 2

3

この 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 式を評価する方法については、次の適切なドキュメントを参照してください。 .

更新

コメントで、OP はchapter要素を逆のドキュメント順で必要とすることを示しましたが、それらのタイトル要素はドキュメント順で必要です。

これを回避するには、次を使用します。

reverse(/inventory/book/chapter[3]/preceding-sibling::chapter)//title
于 2012-05-12T17:09:03.083 に答える
1

使用する必要がなく、明らかに理解していない内部の Saxon 実装クラスをいじっています。必要な作業 (一連のノードの順序を逆にする) は、呼び出し元の Java コードではなく、XPath 式で行う必要があります。

于 2012-05-12T19:37:32.543 に答える