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'的元素。
任何人都可以建議這裏發生了什麼?
感謝,
拉斯
謝謝你,我遇到下列偶然: –
@RussUrquhart那你偶然發現? – JLRishe
對不起。我認爲我的代碼製作了粘貼: (@filter ='filter1'並且包含(ancestor :: SubSection [1]/@ filter,'filter14') –