XSLT листинг в Умбрако - PullRequest
       4

XSLT листинг в Умбрако

0 голосов
/ 06 февраля 2011

У меня есть такая структура:

<EmployeeArea id="1188" level="2" nodeName="Ansatte" urlName="ansatte">

  <EmployeeDepartment id="1189" level="3" nodeName="Ledelse" urlName="ledelse">

    <Employee id="1191" level="4" nodeName="Tommy Pophead" urlName="tommy-pophead" />

    <Employee id="1193" level="4" nodeName="Test Person" urlName="test-person" />

  </EmployeeDepartment>

  <EmployeeDepartment id="1190" level="3" nodeName="Salg" urlName="salg">

    <Employee id="1192" level="4" nodeName="Lars Rocker" urlName="lars-rocker" />

  </EmployeeDepartment>

</EmployeeArea>

Как бы вы, ребята, сделали это в XSLT?

Я думаю что-то вроде a для каждого, который проходит через дочерние элементы Employees, а затем foreach в этом foreach, который проходит через дочерние элементы отделов? Но разве это самый умный способ?

Хотите, чтобы это отображалось на странице следующим образом:

Страница сотрудников:

  • Финансы

- Персона 1 - номер телефона - адрес электронной почты

- Лицо 2

  • Продажа

- Персона 4 - номер телефона - адрес электронной почты

- Персона 5 - номер телефона - адрес электронной почты

Ответы [ 2 ]

4 голосов
/ 06 февраля 2011

Я бы использовал встроенные правила.

Например, этот код:

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

    <xsl:variable name="vBaseLink" select="'http://localhost/'"/>

    <xsl:template match="EmployeeArea">
        <body>
            <h1>
                <a href="{$vBaseLink}{@urlName}">
                    <xsl:value-of select="@nodeName"/>
                </a>
            </h1>
            <xsl:apply-templates/>
        </body>
    </xsl:template>

    <xsl:template match="EmployeeDepartment">
        <h2>
            <a href="{$vBaseLink}{@urlName}">
                <xsl:value-of select="@nodeName"/>
            </a>
        </h2>
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="Employee">
        <div>
            <a href="{$vBaseLink}{@urlName}">
                <xsl:value-of select="@nodeName"/>
            </a>
        </div>
    </xsl:template>

</xsl:stylesheet>

Против вашего образца предоставим такой результат:

<body>
    <h1>
        <a href="http://localhost/ansatte">Ansatte</a>
    </h1>
    <h2>
        <a href="http://localhost/ledelse">Ledelse</a>
    </h2>
    <div>
        <a href="http://localhost/tommy-pophead">Tommy Pophead</a>
    </div>
    <div>
        <a href="http://localhost/test-person">Test Person</a>
    </div>
    <h2>
        <a href="http://localhost/salg">Salg</a>
    </h2>
    <div>
        <a href="http://localhost/lars-rocker">Lars Rocker</a>
    </div>
</body>
0 голосов
/ 14 февраля 2011

Поскольку ваш вопрос относится только к Umbraco, и я недавно работал с ним, я добавлю более конкретный ответ для Umbraco на тот случай, если другие ищут полное решение.

Обратите вниманиечто XSLT является языком типа «Шаблон», он находит самое сильное соответствие для каждого узла и применяет этот шаблон.Это допускает некоторую забавную настройку (например, один шаблон для обычных сотрудников, но специальный шаблон для CIO / CEO / Managers и т. Д.).Пожалуйста, посмотрите на w3schools для получения дополнительной информации.

Учитывая вашу структуру выше, я могу сказать, что Департаменты и Сотрудники являются узлами в вашем Umbracoдерево содержимого, расположенное под узлом EmployeeArea .Предполагая, что это XSLT для применения к EmployeeArea в качестве переменной $ currentPage , хорошо подойдет следующее:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxml="urn:schemas-microsoft-com:xslt"
  xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets"
  xmlns:MyEmployeeLibrary="urn:MyEmployeeLibrary"
  exclude-result-prefixes="MyEmployeeLibrary msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets ">

  <xsl:output method="html" omit-xml-declaration="yes"/>

  <xsl:param name="currentPage"/>

  <xsl:template match="/">
    <h1>Employees page:</h1>
    <ul>
      <xsl:apply-templates select="$currentPage/EmployeeDepartment" />
    </ul>
  </xsl:template>

  <xsl:template match="EmployeeDepartment">
    <li>
      <a href="{umbraco.library:NiceUrl(@id)}">
        <xsl:value-of select="@nodeName" />
      </a>
      <ul>
        <xsl:apply-templates select="Employee" />
      </ul>
    </li>
  </xsl:template>

  <xsl:template match="Employee">
    <li>
      <a href="{umbraco.library:NiceUrl(@id)}">
        <xsl:value-of select="@nodeName" />
        <!-- 
          Your sample XML didn't include phone/email, but your output requests it.
          Let's assume you've created your own XSLT Extension to get this information.
        -->
        <xsl:value-of select="MyEmployeeLibrary:GetDetailsForList(@id)"/>
      </a>
    </li>
  </xsl:template>
</xsl:stylesheet>

Для получения дополнительной информации о создании пользовательского XSLTРасширение для Umbraco, посмотрите обучающие видео для разработчиков в разделе UmbracoTV (это действительно просто, и если вы работаете с 4.6.1, просто перетащите свою DLL в папку \ bin \, и она работает).

ПРИМЕЧАНИЕ: я использовал здесь вложенные теги UL, вы можете изменить его на любой HTML, который вам нравится, теги DIV с назначенным классом CSS - мой предпочтительный метод.

...