xslt如何获取父节点位置的情况,同一节点名也是子节点

时间:2014-07-30 20:10:03

标签: xslt

我想为备用表格行添加颜色。我想使用以下方法:

<xsl:template match="tr">
<xsl:attribute name="bg-color">
<xsl:choose>
<xsl:when test= position() mod 2 = 0><xsl:text>#CCCCCC</xsl:text></xsl:when>
<xsl:otherwise>#DDDDDD</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:template>

但事情是节点<tr>也是标记<tr>的子节点。如何获得父<tr>位置?

<table>
    <tr>
    <td>1</td>
    <td>2</td>
    </tr>

    <tr>
    <td>1</td>
    <td>2</td>
    <tr><td>3</td><td>4</td></tr>
    <tr><td>5</td><td>6</td></tr>
    </tr>
    ...
</table>

如何过滤<tr>内的<tr>

3 个答案:

答案 0 :(得分:0)

您可以使用更具判别性的匹配,例如,如果您不能超过1级:

<xsl:template match="table/tr/td/table/tr">

将应用于包含在第2级表中的tr的模板可能与另一个不同。

或者你可以在match =“tr”中为每个找到的表/ tr / td使用一个调用模板(到命名的tempate)。

或者您可以使用xsl检查祖先是否为tr:if:

<xsl:if test="ancestor::tr"> 

您已经检查了模块性,如果您不想添加模板,只需添加条件,例如:

test="position() mod 2 = 0 and not ancestor::tr"

答案 1 :(得分:0)

如果您使用match="table/tr",则模板仅匹配tr父元素的子元素table元素。但是,在HTML表模型中,无法将tr作为tr的子项。

答案 2 :(得分:0)

<xsl:if test="ancestor::tr">test="position() mod 2 = 0 and not ancestor::tr"是我个案的最佳选择。