2015-05-27 95 views
1

我有一個像下面一種簡單的佈局:檢查是否祖先屬性值是一定值

<SubSection filter="filter14, filter13, filter12"> 

    <SubSection> 
    <para> test </para> 
    </SubSection> 

    <SubSection filter="filter1"> 
     <Reviewer>John Smith</Reviewer> 
    </SubSection> 
</SubSection> 

我使用DocBook的輪廓XSL的部分拉出來,在這種情況下,該款元素filter ='filter14',但是,如果它們是具有filter ='filter14'值的元素的祖先,我也想抽出任何具有filter ='filter1'的元素。

我使用下面的測試,其工作節選爲測試「過濾器1」值:

<!-- Copy all non-element nodes --> 
<xsl:template match="@*|text()|comment()|processing-instruction()" node="profile"> 
    <xsl:copy/> 
</xsl:template> 

<!-- Profile elements based on input parameters --> 
<xsl:template match="*" mode="profile"> 

<!-- This is my input for a filter attribute RU --> 
<xsl:variable name="filter.content"> 

<xsl:if test="@filter"> 
    <xsl:call-template name="cross.compare"> 
     <!-- <xsl:with-param name="a" select="$profile.filter"/> --> 
    <xsl:with-param name="a" select="'filter14'"/> 
    <xsl:with-param name="b" select="@filter"/> 
    </xsl:call-template> 
</xsl:if> 
</xsl:variable> 
<xsl:variable name="filter.ok" select="not(@filter) or 
    $filter.content != '' or @filter = '' or (@filter = 'filter1' and contains(ancestor::SubSection[@filter], 'filter14'))"/> 

<xsl:if test="$filter.ok"> 
    <xsl:copy> 
     <xsl:apply-templates mode="profile" select="@*"/> 

     <xsl:apply-templates select="node()" mode="profile"/> 
    </xsl:copy> 

</xsl:if> 
</xsl:template> 

而且cross.compare是:

<!-- Returns non-empty string if list in $b contains one ore more values from list $a --> 
<xsl:template name="cross.compare"> 
<xsl:param name="a"/> 
<xsl:param name="b"/> 
<xsl:param name="sep" select="$profile.separator"/> 

<xsl:variable name="head" select="substring-before($b, $a)"/> 

<xsl:variable name="tail" select="substring-after($b, $a)"/> 
<xsl:if test="contains($b, $a)">1</xsl:if> 

</xsl:template> 

看來,這僅僅是找到用於檢查當前元素過濾器屬性='filter1'和祖先SubSection元素過濾器屬性是否包含'過濾器14'的右側xpath。我會認爲這會起作用,但事實並非如此。

我仍然使用'filter14'過濾器屬性值以及任何沒有過濾器屬性或過濾器屬性值爲''的元素,但沒有過濾器屬性值爲'filter1'的元素。

任何人都可以建議這裏發生了什麼?

感謝,

拉斯

回答

2

貌似這就是你出了錯:

contains(ancestor::SubSection[@filter], 'filter14') 

這是說「找到第一個SubSection祖先具有@filter屬性,如果產生true它包含'filter14'。

你需要的是這樣的:

ancestor::SubSection[contains(@filter, 'filter14')] 

稍微更強大的版本:

ancestor::SubSection[contains(concat('|', normalize-string(@filter), '|'), '|filter14|')] 
+0

謝謝你,我遇到下列偶然: –

+0

@RussUrquhart那你偶然發現? – JLRishe

+0

對不起。我認爲我的代碼製作了粘貼: (@filter ='filter1'並且包含(ancestor :: SubSection [1]/@ filter,'filter14') –

相關問題