【问题标题】:XSLT add table header base on hierarchy levelXSLT 基于层次结构级别添加表头
【发布时间】:2014-06-26 02:31:24
【问题描述】:

这里是我的 XML 的一部分,表示术语的层次结构。 TopTerm 是最外层的 parent, ChildTerm 是 child,它可以有尽可能多的孩子。

<TopTerm ID="1" Entity="Term" Name="ENVIRONMENTAL MANAGEMENT">
    <ChildTerm Relationship="narrower" ID="8" Entity="Term" Name="Auditing">
        <ChildTerm Relationship="narrower" ID="36" Entity="Term" Name="Environmental audit" />
        <ChildTerm Relationship="narrower" ID="46" Entity="Term" Name="Type of audit []" />
    </ChildTerm>
    <ChildTerm Relationship="narrower" ID="11" Entity="Term" Name="Incidents">
        <ChildTerm Relationship="narrower" ID="71" Entity="Term" Name="Bruce Beresford" />
        <ChildTerm Relationship="narrower" ID="35" Entity="Term" Name="Case name" />
        <ChildTerm Relationship="narrower" ID="83" Entity="Term" Name="Jack Lemmon" />
        <ChildTerm Relationship="narrower" ID="87" Entity="Term" Name="Mary Pcikford" />
    </ChildTerm>
    <ChildTerm Relationship="narrower" ID="16" Entity="Term" Name="Monitoring" />
    <ChildTerm Relationship="narrower" ID="18" Entity="Term" Name="Policies and procedures" />
</TopTerm>

我想要一个带有表格的 XSLT 1.0 HTML 输出,结果应该是这样的

<table>
   <tr>
     <th>Level 1</th>
     <th>Level 2</th>
     <th>Level 3</th>
     <th>Level 4</th>   
   </tr>
   <tr>
     <td>ENVIRONMENTAL MANAGEMENT</td>
     <td>Auditing</td>
     <td>Environmental audit</td>
   </tr>
</table>

类似的东西。我的问题是我不知道这个层次结构的深度来添加适当的&lt;th&gt;Level x&lt;/th&gt;,其中 x 可以是任何基于深度的数字。并且术语级别应该与表格标题匹配。

【问题讨论】:

  • 你能把你尝试过的 XSLT 贴出来吗?
  • 我还没有尝试过任何东西,因为我不知道从哪里开始

标签: xml xslt html-table


【解决方案1】:

我的问题是我不知道这个层次结构的深度来添加 适当的&lt;th&gt;Level x&lt;/th&gt;,其中 x 可以是任意数字 深度。

好吧,你只需要抓住最深的那个并遍历它的祖先。试试这个方法:

XSLT 1.0

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="TopTerm">
    <table border="1">
        <thead>
            <xsl:apply-templates select="descendant::ChildTerm[not(*)]" mode="header">
                <xsl:sort select="count(ancestor-or-self::*)" data-type="number" order="descending"/>
            </xsl:apply-templates>
        </thead>
        <tbody>
            <xsl:apply-templates select="descendant::ChildTerm[not(*)]"/>
        </tbody>
    </table>
</xsl:template>

<xsl:template match="ChildTerm" mode="header">
    <xsl:if test="position()=1">
        <tr>
            <xsl:for-each select="ancestor-or-self::*">
                <th><xsl:value-of select="concat('Level ', position())"/></th>
            </xsl:for-each>
        </tr>
    </xsl:if>
</xsl:template>

<xsl:template match="ChildTerm">
    <tr>
        <xsl:for-each select="ancestor-or-self::*">
            <td><xsl:value-of select="@Name"/></td>
        </xsl:for-each>
    </tr>
</xsl:template>

</xsl:stylesheet>

【讨论】:

  • 很好,看来这就是我所追求的。非常感谢
  • @JackLe 如果您的问题得到解答,请不要忘记通过接受答案来关闭它。
  • 感谢提醒,我对stackoverflow还是很陌生,不知道流程:)
猜你喜欢
  • 2013-07-04
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多