[英]XPATH select distinct values
當兩個屬性(寬度或高度)之一不同時,我想選擇頁面。
這是我的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>
我知道我的選擇不正確,而且我理解為什么。 有可能修改它以獲得正確的結果嗎?
問題在於,XPath中的比較運算符(例如=
和!=
)被隱式存在量化 ,換句話說
@width != preceding-sibling::*/@width
檢查前面是否有其他兄弟姐妹的寬度與我的兄弟姐妹的寬度不同。 你真的想在這種情況下,什么是寬度和高度為這個節點的組合是從寬度和高度的任何其前任的組合不同。 您可以對所有頁面for-each
,並在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>
另外,您也可以將其視為分組問題-按page
元素的寬度和高度對其進行分組,然后每組輸出一個div。 在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分組方法獲得相同的效果(搜索功能可以找到很多其他問題,很好地解釋了該問題,因此在此不再贅述)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.