Html XML使用XSLT按组生成列

Html XML使用XSLT按组生成列,html,xml,xslt,Html,Xml,Xslt,我正在尝试生成一个4列目录,按我所在部门的4个规程分组。一个XML文件包含整个组。每个元素都有一个部门标记。目录的结构如下所示: 按学科对每个条目进行分组。 对于每个组,循环浏览每个条目。如果级别等于主管,请填写主管DIV,否则继续为组中的每个人生成DIV。 一旦组中的所有条目都用完,为下一个组构造下一列。。。 继续前进,直到所有小组都筋疲力尽 我是XSLT新手,非常需要帮助。我可以为每个组创建一个键,并循环浏览组中的条目,但我不确定如何循环浏览不同的组 我的分数在下面 <?xml ver

我正在尝试生成一个4列目录,按我所在部门的4个规程分组。一个XML文件包含整个组。每个元素都有一个部门标记。目录的结构如下所示:

按学科对每个条目进行分组。
对于每个组,循环浏览每个条目。如果级别等于主管,请填写主管DIV,否则继续为组中的每个人生成DIV。 一旦组中的所有条目都用完,为下一个组构造下一列。。。 继续前进,直到所有小组都筋疲力尽

我是XSLT新手,非常需要帮助。我可以为每个组创建一个键,并循环浏览组中的条目,但我不确定如何循环浏览不同的组

我的分数在下面

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="group" match="employee" use="dept" />


<xsl:template match="/">

<div id="directory">    
    <div class="man">
        <h1>Manager</h1>
        <h2>John Doe</h2>
    </div>


    <div class="group">
<xsl:for-each select="key('group', 'Mechanical')">
<xsl:sort select="name" order="ascending"/>

                (I need a conditional here to check if rank = supervisor)
        <div class="super">
            <h1>Supervisor</h1>
            <h2><xsl:value-of select="name"/></h2>
        </div>

            <div>
                <p class="name"><xsl:value-of select="name"/></p>
                                    <p class="ID"><xsl:value-of select="id"/></p>

            </div>
  </xsl:for-each>
</div>

经理
无名氏
(我在这里需要一个条件来检查rank=主管)
监督人

XML目录

<?xml version="1.0" encoding="ISO-8859-1" ?> 

<directory>
  <employee>
    <dept></dept>
    <rank>Manager</rank>
    <name>John Doe</name>
    <id>1234</id>
  </employee>
  <employee>
    <dept>Mechanical</dept>
    <rank>Supervisor</rank>
    <name>Jane Doe</name>
    <id>4321</id>
  </employee>
  <employee>
    <dept>Mechanical</dept>
    <rank>General</rank>
    <name>Joe Doe</name>
    <id>2314</id>
  </employee>
  <employee>
    <dept>Mechanical</dept>
    <rank>General</rank>
    <name>Joe Doe</name>
    <id>2314</id>
  </employee> 
  <employee>
    <dept>Civil</dept>
    <rank>Supervisor</rank>
    <name>Jane Doe</name>
    <id>4321</id>
  </employee>
  <employee>
    <dept>Civil</dept>
    <rank>General</rank>
    <name>Joe Doe</name>
    <id>2314</id>
  </employee>
  <employee>
    <dept>Civil</dept>
    <rank>General</rank>
    <name>Joe Doe</name>
    <id>2314</id>
  </employee>
  <employee>
    <dept>Electrical</dept>
    <rank>Supervisor</rank>
    <name>Jane Doe</name>
    <id>4321</id>
  </employee>
  <employee>
    <dept>Electrical</dept>
    <rank>General</rank>
    <name>Joe Doe</name>
    <id>2314</id>
  </employee>
  <employee>
    <dept>Electrical</dept>
    <rank>General</rank>
    <name>Joe Doe</name>
    <id>2314</id>
  </employee>
 </directory>

经理
无名氏
1234
机械的
监督人
无名氏
4321
机械的
一般的
乔·多伊
2314
机械的
一般的
乔·多伊
2314
公民的
监督人
无名氏
4321
公民的
一般的
乔·多伊
2314
公民的
一般的
乔·多伊
2314
与电有关的
监督人
无名氏
4321
与电有关的
一般的
乔·多伊
2314
与电有关的
一般的
乔·多伊
2314
输出将类似于:

HTML应该类似于:

<div id="directory">    
<div class="man">
<h1>Manager</h1>
<h2>John Doe</h2>
</div>
<div class="group">
    <div class="super">
        <h1>Mechanical Supervisor</h1>
        <h2>Supervisor Name</h2>
    </div>
    <div>
        <p class="name">Mech employee name</p>
                    <p class="ID">Mech employee ID</p>
</div><!--end group A-->

<div class="group">
    <div class="super">
        <h1>CivilSupervisor</h1>
        <h2>Supervisor Name</h2>
    </div>
    <div>
        <p class="name">Civil employee name</p>
                    <p class="ID">Civil employee ID</p>
</div><!--end group B-->

<div class="group">
    <div class="super">
        <h1>Electrical Supervisor</h1>
        <h2>Supervisor Name</h2>
    </div>
    <div>
        <p class="name">Electrical employee name</p>
                    <p class="ID">Electrical employee ID</p>
</div><!--end group C-->
</div>

经理
无名氏
机械主管
主管姓名

机械部员工姓名

机械工员工ID

民事监督员 主管姓名

公务员姓名

公务员ID

电气主管 主管姓名 电气员工姓名

电气员工ID


此XSLT 1.0转换:

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

 <xsl:key name="kEmpByDeptRank" match="employee"
          use="concat(dept,'+', rank)"/>

 <xsl:key name="kEmpByDept" match="employee"
          use="dept"/>

 <xsl:template match="directory">
   <div id="directory">
     <xsl:apply-templates select=
      "key('kEmpByDeptRank', '+Manager')"/>
      <xsl:apply-templates select=
        "employee[not(rank='Manager')]"/>
   </div>
 </xsl:template>

 <xsl:template match=
  "employee[generate-id()
           =
            generate-id(key('kEmpByDept', dept)[1])
           ]
  ">
  <div class="group">
    <xsl:apply-templates mode="inGroup" select=
    "key('kEmpByDeptRank', concat(dept,'+Supervisor'))"/>

    <xsl:apply-templates mode="inGroup" select=
      "key('kEmpByDept', dept)[not(rank='Supervisor')]"/>
  </div>
 </xsl:template>

 <xsl:template match="employee[rank='Manager']">
   <div class="man">
     <h1>Manager</h1>
     <h2><xsl:value-of select="name"/></h2>
   </div>
 </xsl:template>

 <xsl:template match="employee[rank='Supervisor']"
      mode="inGroup">
    <div class="super">
      <h1>
        <xsl:value-of select="concat(dept, ' Supervisor')"/>
      </h1>
      <h2><xsl:value-of select="name"/></h2>
    </div>
 </xsl:template>

 <xsl:template match="employee" mode="inGroup">
   <div>
     <p class="name">
       <xsl:value-of select="concat(dept, ' ', name)"/>
     </p>
     <p class="ID">
       <xsl:value-of select="concat(dept, ' ', id)"/>
     </p>
   </div>
 </xsl:template>
 <xsl:template match="employee"/>
</xsl:stylesheet>
<div id="directory">
   <div class="man">
      <h1>Manager</h1>
      <h2>John Doe</h2>
   </div>
   <div class="group">
      <div class="super">
         <h1>Mechanical Supervisor</h1>
         <h2>Jane Doe</h2>
      </div>
      <div>
         <p class="name">Mechanical Joe Doe</p>
         <p class="ID">Mechanical 2314</p>
      </div>
      <div>
         <p class="name">Mechanical Jim Smith</p>
         <p class="ID">Mechanical 2315</p>
      </div>
   </div>
   <div class="group">
      <div class="super">
         <h1>Civil Supervisor</h1>
         <h2>Ann Smith</h2>
      </div>
      <div>
         <p class="name">Civil Peter Pan</p>
         <p class="ID">Civil 2316</p>
      </div>
      <div>
         <p class="name">Civil Mike Sims</p>
         <p class="ID">Civil 2317</p>
      </div>
   </div>
   <div class="group">
      <div class="super">
         <h1>Electrical Supervisor</h1>
         <h2>Amy Dull</h2>
      </div>
      <div>
         <p class="name">Electrical Dan Brown</p>
         <p class="ID">Electrical 2318</p>
      </div>
      <div>
         <p class="name">Electrical John Kerry</p>
         <p class="ID">Electrical 2319</p>
      </div>
   </div>
</div>

经理

应用于此XML文档时(与提供的文档类似,但将名称和ID更改为不同):


经理
无名氏
1234
机械的
监督人
无名氏
4321
机械的
一般的
乔·多伊
2314
机械的
一般的
吉姆·史密斯
2315
公民的
监督人
安·史密斯
4322
公民的
一般的
彼得潘
2316
公民的
一般的
迈克·西姆斯
2317
与电有关的
监督人
艾米杜尔
4323
与电有关的
一般的
丹布朗
2318
与电有关的
一般的
克里
2319
生成所需的正确结果

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

 <xsl:key name="kEmpByDeptRank" match="employee"
          use="concat(dept,'+', rank)"/>

 <xsl:key name="kEmpByDept" match="employee"
          use="dept"/>

 <xsl:template match="directory">
   <div id="directory">
     <xsl:apply-templates select=
      "key('kEmpByDeptRank', '+Manager')"/>
      <xsl:apply-templates select=
        "employee[not(rank='Manager')]"/>
   </div>
 </xsl:template>

 <xsl:template match=
  "employee[generate-id()
           =
            generate-id(key('kEmpByDept', dept)[1])
           ]
  ">
  <div class="group">
    <xsl:apply-templates mode="inGroup" select=
    "key('kEmpByDeptRank', concat(dept,'+Supervisor'))"/>

    <xsl:apply-templates mode="inGroup" select=
      "key('kEmpByDept', dept)[not(rank='Supervisor')]"/>
  </div>
 </xsl:template>

 <xsl:template match="employee[rank='Manager']">
   <div class="man">
     <h1>Manager</h1>
     <h2><xsl:value-of select="name"/></h2>
   </div>
 </xsl:template>

 <xsl:template match="employee[rank='Supervisor']"
      mode="inGroup">
    <div class="super">
      <h1>
        <xsl:value-of select="concat(dept, ' Supervisor')"/>
      </h1>
      <h2><xsl:value-of select="name"/></h2>
    </div>
 </xsl:template>

 <xsl:template match="employee" mode="inGroup">
   <div>
     <p class="name">
       <xsl:value-of select="concat(dept, ' ', name)"/>
     </p>
     <p class="ID">
       <xsl:value-of select="concat(dept, ' ', id)"/>
     </p>
   </div>
 </xsl:template>
 <xsl:template match="employee"/>
</xsl:stylesheet>
<div id="directory">
   <div class="man">
      <h1>Manager</h1>
      <h2>John Doe</h2>
   </div>
   <div class="group">
      <div class="super">
         <h1>Mechanical Supervisor</h1>
         <h2>Jane Doe</h2>
      </div>
      <div>
         <p class="name">Mechanical Joe Doe</p>
         <p class="ID">Mechanical 2314</p>
      </div>
      <div>
         <p class="name">Mechanical Jim Smith</p>
         <p class="ID">Mechanical 2315</p>
      </div>
   </div>
   <div class="group">
      <div class="super">
         <h1>Civil Supervisor</h1>
         <h2>Ann Smith</h2>
      </div>
      <div>
         <p class="name">Civil Peter Pan</p>
         <p class="ID">Civil 2316</p>
      </div>
      <div>
         <p class="name">Civil Mike Sims</p>
         <p class="ID">Civil 2317</p>
      </div>
   </div>
   <div class="group">
      <div class="super">
         <h1>Electrical Supervisor</h1>
         <h2>Amy Dull</h2>
      </div>
      <div>
         <p class="name">Electrical Dan Brown</p>
         <p class="ID">Electrical 2318</p>
      </div>
      <div>
         <p class="name">Electrical John Kerry</p>
         <p class="ID">Electrical 2319</p>
      </div>
   </div>
</div>

经理
无名氏
机械主管
无名氏
机械工程部

机械2314

机械吉姆·史密斯

机械2315

民事监督员 安·史密斯 民间的彼得·潘

土木工程2316

民用迈克·西姆斯

土木工程2317

电气主管 艾米杜尔 电气工程师丹·布朗

电气2318

电气约翰·克里

电气2319

并在浏览器中显示为

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

 <xsl:key name="kEmpByDeptRank" match="employee"
          use="concat(dept,'+', rank)"/>

 <xsl:key name="kEmpByDept" match="employee"
          use="dept"/>

 <xsl:template match="directory">
   <div id="directory">
     <xsl:apply-templates select=
      "key('kEmpByDeptRank', '+Manager')"/>
      <xsl:apply-templates select=
        "employee[not(rank='Manager')]"/>
   </div>
 </xsl:template>

 <xsl:template match=
  "employee[generate-id()
           =
            generate-id(key('kEmpByDept', dept)[1])
           ]
  ">
  <div class="group">
    <xsl:apply-templates mode="inGroup" select=
    "key('kEmpByDeptRank', concat(dept,'+Supervisor'))"/>

    <xsl:apply-templates mode="inGroup" select=
      "key('kEmpByDept', dept)[not(rank='Supervisor')]"/>
  </div>
 </xsl:template>

 <xsl:template match="employee[rank='Manager']">
   <div class="man">
     <h1>Manager</h1>
     <h2><xsl:value-of select="name"/></h2>
   </div>
 </xsl:template>

 <xsl:template match="employee[rank='Supervisor']"
      mode="inGroup">
    <div class="super">
      <h1>
        <xsl:value-of select="concat(dept, ' Supervisor')"/>
      </h1>
      <h2><xsl:value-of select="name"/></h2>
    </div>
 </xsl:template>

 <xsl:template match="employee" mode="inGroup">
   <div>
     <p class="name">
       <xsl:value-of select="concat(dept, ' ', name)"/>
     </p>
     <p class="ID">
       <xsl:value-of select="concat(dept, ' ', id)"/>
     </p>
   </div>
 </xsl:template>
 <xsl:template match="employee"/>
</xsl:stylesheet>
<div id="directory">
   <div class="man">
      <h1>Manager</h1>
      <h2>John Doe</h2>
   </div>
   <div class="group">
      <div class="super">
         <h1>Mechanical Supervisor</h1>
         <h2>Jane Doe</h2>
      </div>
      <div>
         <p class="name">Mechanical Joe Doe</p>
         <p class="ID">Mechanical 2314</p>
      </div>
      <div>
         <p class="name">Mechanical Jim Smith</p>
         <p class="ID">Mechanical 2315</p>
      </div>
   </div>
   <div class="group">
      <div class="super">
         <h1>Civil Supervisor</h1>
         <h2>Ann Smith</h2>
      </div>
      <div>
         <p class="name">Civil Peter Pan</p>
         <p class="ID">Civil 2316</p>
      </div>
      <div>
         <p class="name">Civil Mike Sims</p>
         <p class="ID">Civil 2317</p>
      </div>
   </div>
   <div class="group">
      <div class="super">
         <h1>Electrical Supervisor</h1>
         <h2>Amy Dull</h2>
      </div>
      <div>
         <p class="name">Electrical Dan Brown</p>
         <p class="ID">Electrical 2318</p>
      </div>
      <div>
         <p class="name">Electrical John Kerry</p>
         <p class="ID">Electrical 2319</p>
      </div>
   </div>
</div>
经理 无名氏 机械主管 无名氏 机械母鹿

机械2314

机械工程师吉姆·史密斯

机械2315

民事监督员 安·史密斯 公民彼得·潘

民事2316

市民迈克·西姆斯

民事2317

电气主管 艾米杜尔 丹布朗电气公司

电气2318

电气工程师约翰·克里

电气2319


解释,并使用复合键
(职级、部门)
查找
员工(经理或主管)

请编辑问题并提供确切的想要的输出。而且,您的XML不太具有代表性——只有一个部门(机械部门)和一个没有名字的部门……很抱歉,表示方式太粗糙了。我在用手机。没有名字的部门是故意的,因为经理监督所有的部门。管理器就像一个标题div。每个disipline都是一个构成列的div。根据纪律,每个人都在一个分区内。谢谢。尽管如此,所需的输出仍以纯文本形式绘制,而从代码中可以明显看出您需要html输出。我可以解决产生想要的输出的问题——唯一的问题是这个想要的输出还没有定义(从外观上看,在我看来,输出应该在
表中