使用根据元素的祖先元素来格式化元素

发布于 2025-01-06 22:17:32 字数 2627 浏览 0 评论 0原文

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

具体来说,我想申请标签 的后代元素元素。我想申请标签 的后代元素元素。我最好的猜测是我必须使用我的中的元素元素。我在测试中尝试了几种不同的xpath表达式,但没有一个起作用。

问题:吗?最好的选择是什么?

这是我的 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

I'm a newbie and I'm trying to use test in an <xsl:when> element to see if the current node is a descendant of an earlier node. I then want to apply the appropriate html tag to the content. I am a novice with xpath expressions.

Specifically, I would like to apply <th> tags to the <tcell> elements that are descendants of the <thead> element. I would like to apply <td> tags to the <tcell> elements that are descendants of the <tbody> elements. My best guess is that I have to use an <xsl:choose> element in my <xsl:template match="tcell"> element. I have tried a few different xpath expressions in the test, but none of them have worked.

Question: Is <xsl:choose> the best option for this?

Here is my xml document, the applicable part. The document structure cannot be changed.

<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>

I want to use XSL/XPath to generate a table with a header row and body rows. My XSL stylesheet looks like this:

<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>

Any help would be appreciated.

Sample html output

<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>

Thanks,
M_66

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

娇俏 2025-01-13 22:17:32
<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>
<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>

or if you still want to use 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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文