我一直在努力解决这个问题的正确语法,它归结为:
如何测试父节点的属性是否具有特定值?
我正在改造一些XHTML。我模板匹配<tr>
以重新格式化该行中某些单元格的colspan
属性。为了进一步确信这只会出现在某些表中,我需要检查<table>
所属的<tr>
是否具有特定的id属性值。
<xsl:template match="tr">
<tr>
<xsl:choose>
<xsl:when test="(count(td[@colspan='2'])=2 and count(td)=3)">
<td colspan="1">
<xsl:copy-of select="td[1]/node()" />
</td>
<td colspan="4">
<xsl:copy-of select="td[2]/node()" />
</td>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="@*|node()" />
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:template>
这是我到目前为止的代码。我要么在测试时添加“ands”,要么在另一个xsl:if
或xsl:when
添加“ands”以检查表属性。对于这个例子,让我们得到表id =“Transformable”。
为了澄清,我只希望在<tr>
所属的表具有“可转换”的id时进行上述转换。
非常感谢任何帮助。
答案 0 :(得分:1)
我猜您可以在模板匹配定义中使用parent
轴。
<xsl:template match="tr[parent::table/@id = 'Transformable']">
This template matches only 'tr' within a 'table' with 'id' attribute which equals 'Transformable'.
</xsl:template>
更新:对于复杂的嵌套(如果table
不是tr
的直接父级) - 您可以使用ancestor
轴。
<xsl:template match="tr[ancestor::table/@id = 'Transformable']">
This template matches only 'tr' within a 'table' with 'id' attribute which equals 'Transformable'.
</xsl:template>
答案 1 :(得分:0)
你应该尝试一下(在你的测试条款中):
parent :: table [@id ='Transformable']
答案 2 :(得分:0)
您也可以使用代表父
的..选择器<xsl:when test="..[@colspan='2']">