XML Генерация столбцов по группам с использованием XSLT - PullRequest
1 голос
/ 24 сентября 2011

Я пытаюсь создать каталог из 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>

Каталог 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>

Вывод будет выглядеть примерно так: directory

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>

1 Ответ

2 голосов
/ 24 сентября 2011

Это преобразование 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>

при применении к этому документу XML (аналогично предоставленному, но изменились имена и идентификаторы, чтобы они былиотлично):

<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>Jim Smith</name>
    <id>2315</id>
  </employee>
  <employee>
    <dept>Civil</dept>
    <rank>Supervisor</rank>
    <name>Ann Smith</name>
    <id>4322</id>
  </employee>
  <employee>
    <dept>Civil</dept>
    <rank>General</rank>
    <name>Peter Pan</name>
    <id>2316</id>
  </employee>
  <employee>
    <dept>Civil</dept>
    <rank>General</rank>
    <name>Mike Sims</name>
    <id>2317</id>
  </employee>
  <employee>
    <dept>Electrical</dept>
    <rank>Supervisor</rank>
    <name>Amy Dull</name>
    <id>4323</id>
  </employee>
  <employee>
    <dept>Electrical</dept>
    <rank>General</rank>
    <name>Dan Brown</name>
    <id>2318</id>
  </employee>
  <employee>
    <dept>Electrical</dept>
    <rank>General</rank>
    <name>John Kerry</name>
    <id>2319</id>
  </employee>
 </directory>

дает требуемый, правильный результат :

<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

Объяснение : Метод Мюнхена длягруппировка и поиск employee (менеджер или супервизор) с использованием составного ключа (rank, department).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...