所有特定值

时间:2017-08-09 16:08:27

标签: xml xslt

使用XSLT,当列只包含“Jack”时,我需要删除一个完整的表行,我做了它,但它在匹配后删除了所有行

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template name="ident" match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="tr">
    <xsl:if test="../../tr/td[text()='Jack']">
        <xsl:call-template name="ident" />
    </xsl:if>
</xsl:template>    

<table>
    <th>
        <td>Contestant</td>
        <td>Score</td>
        <td>Country</td>
    </th>
    <tr>
        <td>Jack</td>
        <td>0.00</td>
        <td>AUS</td>
    </tr>
    <tr>
        <td>Jill</td>
        <td>-</td>
        <td>-</td>
    </tr>
</table>

1 个答案:

答案 0 :(得分:1)

使用当前表达式,../../tr实际上会查找当前行的“祖父母”(即tr的父级)兄弟的table元素,我猜这不是什么你想要的。

如果要删除行,如果任何列包含单词jack,则模板应如下所示。

<xsl:template match="tr">
    <xsl:if test="not(td[text()='Jack'])">
        <xsl:call-template name="ident" />
    </xsl:if>
</xsl:template>    

或者,或许更好的是,有一个模板可以删除任何带插孔的行,就像这样......

<xsl:template match="tr[td/text()='Jack']" />