2014-06-30 155 views
0

我想在兩個屬性之一(寬度或高度)不同時選擇頁面。XPATH選擇不同的值

這裏是我的XML:

<pages> 
    <page id="page0001" height="1000" width="960"></page> 
    <page id="page4931" height="1000" width="960"></page> 
    <page id="page6342" height="1000" width="961"></page> 
    <page id="page7995" height="1001" width="961"></page> 
    <page id="page4461" height="1001" width="960"></page> 
    <page id="page4690" height="1001" width="960"></page> 
    <page id="page9001" height="1001" width="961"></page> 
</pages> 

這裏我選擇

<xsl:for-each select="/prototype/pages/page[@width != (preceding-sibling::*/@width) or @height != (preceding-sibling::*/@height) or position() = 1]"> 
    <div class="{@width}x{@height} {@id}"></div> 
</xsl:for-each> 

下面的結果:

<div class="960x1000 page0001"></div> 
<div class="961x1000 page6342"></div> 
<div class="961x1001 page7995"></div> 
<div class="960x1001 page4461"></div> 
<div class="960x1001 page4690"></div> 
<div class="961x1001 page9001"></div> 

我希望有

<div class="960x1000 page0001"></div> 
<div class="961x1000 page6342"></div> 
<div class="961x1001 page7995"></div> 
<div class="960x1001 page4461"></div> 
什麼

我知道我的選擇不正確,我明白爲什麼。有沒有可能修改它以獲得正確的結果?

回答

1

的問題是比較操作符,如在XPath中=!=隱含存在上定量,換句話說

@width != preceding-sibling::*/@width 

檢查是否存在任何前置兄弟,其寬度從我的不同。這種情況下實際需要的是,此節點的寬度和高度的組合與任何其前任的寬度和高度的組合不同。組page元素通過它們的寬度和高度,並輸出一個DIV - 你可以用for-each在所有頁面和的for-each

<xsl:for-each select="/prototype/pages/page"> 
    <xsl:variable name="myWidth" select="@width" /> 
    <xsl:variable name="myHeight" select="@height" /> 
    <xsl:if test="not(preceding-sibling::*[@height=$myHeight][@width=$myWidth])"> 
     <div class="{@width}x{@height} {@id}"></div> 
    </xsl:if> 
</xsl:for-each> 

或者身體內的測試,你可以把它當作一個分組問題,做到這一點每組。在XSLT 2.0,這可能是

<xsl:for-each-group select="/prototype/pages/page" 
     group-by="concat(@width, 'x', @height)"> 
    <div class="{current-grouping-key()} {@id}" /> 
</xsl:for-each-group> 

在1.0,你可以使用Muenchian分組的方法得到相同的效果(也有,你可以發現,解釋以及其他許多問題具有搜索功能,所以我不會在這裏重複一遍)。

+0

謝謝,我沒有真正能夠闡明我的選擇有什麼問題。其實我想通過使用單個選擇保存一些迭代。它對xpath的接縫太複雜了:p – Charles

+0

@charles我懷疑它確實「保存」了任何東西,因爲處理器必須依次檢查所有的'page'元素,以決定哪些元素與謂詞相匹配。它只是顯式的「if」和謂詞將編譯成的隱式謂詞之間的區別。 –

+0

和代碼是更清潔,但無論如何感謝:) – Charles