2017-04-12 85 views
0

我在使用XPATH時遇到問題,可能會使用一些指導。我已經使用了w3schools教程 - 它不夠先進,無法幫助我弄清楚我做錯了什麼。 (我預計未來需要更多地使用XPATH--所以推薦給好的教程或書籍也將被讚賞)。XPATH:計算祖先節點中的先前元素

我正在研究一本有可選標題的書。如果使用listTitle,我想預先將一個列表編號與標題連接起來,並鏈接到章節和列表編號(基於listTitle)。不包含listTitle的列表不應增加列表計數器。

下面是示出與所希望的結果的一例的XML文件:

<chapter><title>Chapter 1></title> 
    <para>Para text.</para> 
    <ul><listTitle>List 1-1</listTitle> .... </ul> 

    <section><title>Section 1.1</title> 
    <ol> .... </ol> 
    <ol><listTitle>List 1-2</listTitle> ... </ol> 
    </section> 

    <ol><listTitle>List 1-3</listTitle> ... </ol> 
    <ul><listTitle>List 1-4</listTitle> ... </ul> 
</chapter> 

<chapter><title>Chapter 2></title> 
    <para>Para text.</para> 
    <ul><listTitle>List 2-1</listTitle> .... </ul> 

    <section><title>Section 2.1</title> 
    <ol> .... </ol> 
    <ol><listTitle>List 2-2</listTitle> ... </ol> 
    </section> 

    <ol><listTitle>List 2-3</listTitle> ... </ol> 
    <ul><listTitle>List 2-4</listTitle> ... </ul> 
</chapter> 

然而,實際的結果稍有不同。我的listTitle計數並沒有從章節層面重新開始......所以listTitles繼續計數(也就是,而不是List 2-1,我得到List 2-5)。我只是無法弄清楚如何指定章節關係以在章節級別重置計數。

我XPATH:

'concat("List ",count(../preceding::chapter)+1," - ",(count(preceding::*:ol/*:listTitle) 
+ count(ancestor::*:ol/*:listTitle)+ count(preceding::*:ul/*:listTitle) 
+ count(ancestor::*:ul/*:listTitle))," ")' 
+0

?你是否使用xpath作爲XSLT的一部分? (如果是這樣,['xsl:number'](https://www.w3.org/TR/xslt#number)將會非常有幫助。) –

+0

嗨丹尼爾 - 感謝您的洞察力。不幸的是,我受限於爲我的部署在一個css文件中的函數中進行計數......它非常具體,並且是Oxygen XML Author專有的。 –

回答

0

問題被引起,至少部分地XMLNS問題。

這StackOverflow的文章幫助:XML element has namespace, my XPATH does not work

下面的代碼提供正確的列表標題計數:你在使用處理您的XPath

('concat("List ", count(preceding::chapter)+1,"-", for $i in 
count(preceding::chapter) return ((count(//parent::basicDocument// 
chapter[$i+1]//*[name() = "listTitle"] intersect preceding::*)) + 1)," ")'