Хороший стиль кодирования для выбора регистра в XSLT - PullRequest
1 голос
/ 05 февраля 2011

Я хочу, чтобы страница отображала A, B, C, D в зависимости от возвращаемого значения из значения XML (1,2,3,4).Мои подходы с помощью JavaScript или XSLT: выбрать.Я хочу знать, какой путь лучше и почему?Могу ли я сделать этот регистр в коде .cs (хорошо или плохо)?Должен ли я код JavaScript в XSLT?Может ли сообщество, пожалуйста, посоветовать?Спасибо.

Ниже приведен код.

Способ Javascript (этот работает):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:js="urn:custom-javascript">
  <xsl:template match="page">

    <msxsl:script language="JavaScript" implements-prefix="js">
      <![CDATA[
        function translateSkillLevel(level)
        {
          switch (level)
          {
            case 0: return "Level 1";
            case 1: return "Level 2";
            case 2: return "Level 3";
          }
        return "unknown";
        }
        ]]>
    </msxsl:script>

    <div id="skill">
      <table border="0" cellpadding="1" cellspacing="1">
        <tr>
          <th>Level</th>
        </tr>
        <xsl:for-each select="/page/Skill">
          <tr>
            <td>
              <!-- difference here -->
              <script type="text/javascript">
                document.write(translateSkillLevel(<xsl:value-of select="@level"/>));
              </script>
            </td>
          </tr>

        </xsl:for-each>
      </table>
    </div>
  </xsl:template>
</xsl:stylesheet>

Способ Javascript (этот не работает, получение неопределенного тега js):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:js="urn:custom-javascript">
  <xsl:template match="page">

    <msxsl:script language="JavaScript" implements-prefix="js">
      <![CDATA[
        function translateSkillLevel(level)
        {
          switch (level)
          {
            case 0: return "Level 1";
            case 1: return "Level 2";
            case 2: return "Level 3";
          }
        return "unknown";
        }
        ]]>
    </msxsl:script>

    <div id="skill">
      <table border="0" cellpadding="1" cellspacing="1">
        <tr>
          <th>Level</th>
        </tr>
        <xsl:for-each select="/page/Skill">
          <tr>
            <td>
               <!-- difference here -->
               <xsl:value-of select="js:translateSkillLevel(string(@level))"/>
            </td>
          </tr>

        </xsl:for-each>
      </table>
    </div>
  </xsl:template>
</xsl:stylesheet>

XSLT путь:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="page">
    <div id="skill">
      <table border="0" cellpadding="1" cellspacing="1">
        <tr>
          <th>Level</th>
        </tr>
        <xsl:for-each select="/page/Skill">
          <tr>
            <td>
              <xsl:choose>
                <xsl:when test="@level = 0">
                  Level 1
                </xsl:when>
                <xsl:when test="@level = 1">
                  Level 2
                </xsl:when>
                <xsl:when test="@level = 2">
                  Level 3
                </xsl:when>
                <xsl:otherwise>
                  unknown
                </xsl:otherwisexsl:otherwise>
              </xsl:choose>
            </td>
          </tr>

        </xsl:for-each>
      </table>
    </div>
  </xsl:template>
</xsl:stylesheet>

РЕДАКТИРОВАТЬ: Кроме того, у меня есть несколько встроенных функций JavaScript для отправки формы.

<input type="submit" onclick="javascript:document.forms[0].submit();return false;"/>

Ответы [ 3 ]

3 голосов
/ 05 февраля 2011

Из этих двух я бы определенно пошел по пути XSLT.Для этого не нужно вызывать весь движок сценария.

2 голосов
/ 05 февраля 2011

Во-первых, способ XSLT будет выглядеть примерно так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="page">
        <div id="skill">
            <table border="0" cellpadding="1" cellspacing="1">
                <tr>
                    <th>Level</th>
                </tr>
                <xsl:apply-templates/>
            </table>
        </div>
    </xsl:template>
    <xsl:template match="Skill">
        <tr>
            <td>
                <xsl:apply-templates select="@level"/>
            </td>
        </tr>
    </xsl:template>
    <xsl:template match="@level">Unknown</xsl:template>
    <xsl:template match="@level[3>.]">
        <xsl:value-of select="concat('Level ',.+1)"/>
    </xsl:template>
</xsl:stylesheet>

Ввод:

<page>
    <Skill level="1"/>
    <Skill level="4"/>
</page>

Вывод:

<div id="skill">
    <table border="0" cellpadding="1" cellspacing="1">
        <tr>
            <th>Level</th>
        </tr>
        <tr>
            <td>Level 2</td>
        </tr>
        <tr>
            <td>Unknown</td>
        </tr>
    </table>
</div>

Во-вторых: первая таблица стилейне "работает" как есть, если вы не определите в некотором элементе HTML SCRIPT функцию translateSkillLevel javascript (или, лучше, внешнюю LINK).

В-третьих: ваша вторая таблица стилей может "работа ", но реализации встроенных функций расширения не являются стандартным механизмом расширения XSLT .Вот почему вы используете нестандартный элемент расширения , делающий вашу таблицу стилей не переносимой между процессорами XSLT.

1 голос
/ 05 февраля 2011

Функции расширения не нужны, XSLT достаточно мощный и достаточно гибкий.

Я рекомендую реализацию XSLT: (в значительной степени настраиваемый, гибкий и расширяемый):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="my:my" exclude-result-prefixes="my">

 <my:skills>
  <s v="0" d="1"/>
  <s v="1" d="2"/>
  <s v="2" d="3"/>
  <other>unknown</other>
 </my:skills>

 <xsl:variable name="vSkills" select=
  "document('')/*/my:skills/*"/>

 <xsl:variable name="vUnknown" select=
  "document('')/*/my:skills/other"/>

 <xsl:template match="page">
    <div id="skill">
        <table border="0" cellpadding="1" cellspacing="1">
            <tr>
                <th>Level</th>
            </tr>
            <xsl:apply-templates select="Skill/@level"/>
        </table>
    </div>
 </xsl:template>

 <xsl:template match="@level">
  <tr>
    <td>
      <xsl:variable name="vSkill" select=
      "$vSkills[@v=current()]/@d"/>
      <xsl:value-of select="$vSkill|$vUnknown[not($vSkill)]"/>
    </td>
  </tr>
 </xsl:template>
</xsl:stylesheet>

когда указанное преобразование применяется к следующему документу XML :

<page>
    <Skill level="1"/>
    <Skill level="4"/>
</page>

желаемый, правильный результат получается :

<div id="skill">
    <table border="0" cellpadding="1" cellspacing="1">
        <tr>
            <th>Level</th>
        </tr>
        <tr>
            <td>2</td>
        </tr>
        <tr>
            <td>unknown</td>
        </tr>
    </table>
</div>

Примечание: :

  1. Все правила перевода текущего значения навыка в отображаемое значение указываются в виде данных .

  2. Данные решения могут быть в отдельном документе , так что достигается полная параметризация.

  3. Мы делаемне полагаться на случайную зависимость (например, dispValue = значение +1) - любое отношение b / n к текущему значению и отображаемому значению может быть выражено.

  4. В коде XSLT нет абсолютно никакой условной логики !

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