Сортировка в XSLT внутри вложенного For Each - PullRequest
3 голосов
/ 08 февраля 2012

Вот что я пытаюсь сделать: у меня есть список факультетов, в каждом из которых есть список факультетов.Я хочу отобразить весь список отделов, отсортированный по названию отдела, но с указанием факультета.

XML выглядит так:

<Faculties>

  <Faculty Name="Science">
    <Department name="dept2">
      <head>Mr X</head>
      <building>A Block</building>
      etc...
   </Department>
   <Department name="dept3">
      <head>Mr X</head>
      <building>B Block</building>
      etc...
   </Department>
  </Faculty>

  <Faculty Name="Education">
    <Department name="dept1">
      <head>Mr Y</head>
      <building>C Block</building>
      etc...
    </Department>
  </Faculty>

</Faculties>    

XSLT выглядит примерно так: (IЯ упростил XSLT в целях пояснения.)

<xsl:for-each select="Faculties">
  <xsl:sort select="DepartmentName">
  <xsl:for-each select="Departments">
    <xsl:element name="div">
      <xsl:attribute name="id"><xsl:value-of select="facultName"></xsl:attribute>
      <h3><xsl:value-of select="deptName"> - <xsl:value-of select="facultName"></h3>
      //More stuff here
    </xsl:element>
  </xsl:for-each>
</xsl:for-each>

Мне бы хотелось, чтобы выходные данные выглядели так:

Dept1 (Education)
Head: Mr Y
Building: C Block

Dept2 (Science)
Head: Mr X
Building: A Block

Dept3 (Science)
Head: Mr X
Building: B Block

Где они отсортированы по названию отдела.

Я также хочу иметь возможность скрыть все отделы от определенного факультета, используя Javascript, то есть скрыть все div, которые имеют определенный факультет в id.

Я даже не уверен, что я пытаюсьвозможно (или логично).Мой единственный другой вариант - это создание совершенно нового списка кафедр с преподавательским составом в качестве одного из элементов.Тогда мне нужен только один для каждого.К сожалению, я не могу реально контролировать, как генерируется XML, поэтому я надеюсь, что смогу сделать это таким образом.

Я ценю любую помощь.Спасибо!

1 Ответ

9 голосов
/ 08 февраля 2012

Если вы хотите перечислить все отделы в порядке названий, независимо от факультета, вы можете просто перебирать отделы напрямую

<xsl:for-each select="Faculty/Department">
   <xsl:sort select="@deptName" />

</xsl:for-each>

Затем, чтобы получить название факультета для кафедры, вы можете легко получить доступ к родительскому элементу

<xsl:value-of select="../@facultyName" />

Итак, если у вас есть следующий XML

<Faculties>
   <Faculty id="1" facultyName="Beer Drinking">
      <Department id="1" deptName="Real Ale" />
      <Department id="2" deptName="Lager" />
   </Faculty>
   <Faculty id="2" facultyName="Food">
      <Department id="3" deptName="Fish and Chips" />
      <Department id="4" deptName="Pies" />
   </Faculty>
</Faculties>

При применении следующего XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>

   <xsl:template match="/Faculties">
      <xsl:apply-templates select="Faculty/Department">
         <xsl:sort select="@deptName" />
      </xsl:apply-templates>
   </xsl:template>

   <xsl:template match="Department">
      <div id="{../@facultyName}">
      <h3><xsl:value-of select="concat(@deptName, ' - ', ../@facultyName)" /></h3>
      </div>
   </xsl:template>
</xsl:stylesheet>

Выводится следующее

<div id="Food">
   <h3>Fish and Chips - Food</h3>
</div>
<div id="Beer Drinking">
   <h3>Lager - Beer Drinking</h3>
</div>
<div id="Food">
   <h3>Pies - Food</h3>
</div>
<div id="Beer Drinking">
   <h3>Real Ale - Beer Drinking</h3>
</div>

Обратите внимание, что обычно желательно использовать xsl: apply-templates over xsl: for-each , и именно это я и использовал в XSLT.

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