使用<xsl:choose>根据元素的祖先元素格式化元素</xsl:choose>

时间:2012-02-17 21:48:33

标签: xml xslt xpath

我是新手,我正在尝试在&lt; xsl:when&gt;中使用测试用于查看当前节点是否是较早节点的后代的元素。然后,我想将适当的html标记应用于内容。我是xpath表达式的新手。

具体来说,我想申请&lt; th&gt;标签到&lt; tcell&gt;作为&lt; thead&gt;的后代的元素元件。我想申请&lt; td&gt;标签到&lt; tcell&gt;作为&lt; tbody&gt;的后代的元素元素。我最好的猜测是我必须使用&lt; xsl:choose&gt;我的&lt; xsl:template match =“tcell”&gt;中的元素元件。我在测试中尝试了一些不同的xpath表达式,但没有一个能够工作。

问题:是&lt; xsl:choose&gt;这个的最佳选择?

这是我的xml文档,适用的部分。文档结构无法更改。

<table>
  <tgroup>
    <thead>
      <trow>
        <tcell>Column Head Text</tcell>
        <tcell>Column Head Text</tcell>
      </trow>
    </thead>
    <tbody>
      <trow>
        <tcell>Cell Text</tcell>
        <tcell>Cell Text</tcell>
      </trow>        
    </tbody>
  </tgroup>
 </table>

我想使用XSL / XPath生成一个包含标题行和正文行的表。我的XSL样式表看起来像这样:

<xsl:template match="/">
  <html>
    <body>
    <xsl:apply templates />
    </body>
  </html>
</xsl:template>

<xsl:template match="table">
    <table>
        <xsl:apply-templates />
    </table>
</xsl:template>

<xsl:template match="tgroup">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="thead">
    <thead>
        <xsl:apply-templates />
    </thead>
</xsl:template>

<xsl:template match="tbody">
    <tbody>
        <xsl:apply-templates />
    </tbody>
</xsl:template>       

<xsl:template match="trow">
    <tr>
        <xsl:apply-templates />
    </tr>
</xsl:template>

<!-- MY TROUBLE STARTS HERE -->
<xsl:template match="tcell">
    <xsl:choose>
      <xsl:when test="current()!=descendant::tbody">
        <th>
          <xsl:value-of select="."/>
        </th>
      </xsl:when>
      <xsl:otherwise>
        <td>
          <xsl:value-of select="."/>
        </td>
      </xsl:otherwise>
    </xsl:choose>
</xsl:template>

任何帮助都将不胜感激。

示例html输出

<table>
  <tgroup>
    <thead>
     <tr>
      <th>Column Head Text</th>
      <th>Column Head Text</th>
     <tr>
    </thead>
    <tbody>
      <tr>
       <td>Cell Text</td>
       <td>Cell Text</td>
      </tr>
    </tbody>
  </tgroup>
 </table>

谢谢, M_66

1 个答案:

答案 0 :(得分:0)

<xsl:template match="thead//tcell">
    <th>
        <xsl:value-of select="."/>
    </th>
</xsl:template>

<xsl:template match="tbody//tcell">
    <td>
        <xsl:value-of select="."/>
    </td>
</xsl:template>

或者如果您仍想使用xsl:choose

<xsl:template match="tcell">
    <xsl:choose>
        <xsl:when test="ancestor::thead">
            <th>
                <xsl:value-of select="."/>
            </th>
        </xsl:when>
        <xsl:otherwise>
            <td>
                <xsl:value-of select="."/>
            </td>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>