Существует ли изящный способ добавить несколько классов HTML с XSLT?

Хорошее чтение является книгой Jimmi Nilssons (и блог в этом отношении) домен Applying управляемый дизайн

, Это - смесь книг Evans и Fowlers ( Управляемый Доменом Дизайн - Evans), и ( Шаблоны Архитектуры приложений для предприятия - Fowler)

7
задан Jakob 26 October 2009 в 15:42
поделиться

3 ответа

Во-первых, нет ничего плохого в пробелах в значениях атрибутов в XML: грубо говоря, нормализация значений атрибутов преобразует символы пробелов в пробелы и сворачивает соседние пробелы в один пробел, когда документ анализируется, но пробелы разрешены. РЕДАКТИРОВАТЬ: Подробнее об этом см. Ниже

Подход Мэтью Уилсона не включает пробелы между возможными значениями, как вы упомянули в своем комментарии к нему. Однако его подход в основе своей обоснован. Последняя часть головоломки - это ваша неприязнь к избыточным пробелам: их можно устранить с помощью функции XPath normalize-space .

Следующая таблица стилей объединяет все части вместе - обратите внимание, что это не так. не делать ничего с входным документом, поэтому в целях тестирования вы можете запустить его с любым XML-документом или даже с самим собой, чтобы убедиться, что вывод соответствует вашим требованиям.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:variable name="foo0" select="false()"/>
  <xsl:variable name="bar0" select="true()"/>

  <xsl:variable name="foo1" select="true()"/>
  <xsl:variable name="bar1" select="false()"/>

  <xsl:variable name="foo2" select="true()"/>
  <xsl:variable name="bar2" select="true()"/>

  <xsl:template match="/">

    <xsl:variable name="foobar0">
      <xsl:if test="$foo0"> foo</xsl:if>
      <xsl:if test="$bar0"> bar</xsl:if>
    </xsl:variable>

    <xsl:variable name="foobar1">
      <xsl:if test="$foo1"> foo</xsl:if>
      <xsl:if test="$bar1"> bar</xsl:if>
    </xsl:variable>

    <xsl:variable name="foobar2">
      <xsl:if test="$foo2"> foo</xsl:if>
      <xsl:if test="$bar2"> bar</xsl:if>
    </xsl:variable>

    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar0)"/>
      </xsl:attribute>
    </li>
    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar1)"/>
      </xsl:attribute>
    </li>
    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar2)"/>
      </xsl:attribute>
    </li>

  </xsl:template>
</xsl:stylesheet>

РЕДАКТИРОВАТЬ: В дополнение к вопросу о пробелах, разделяющих дискретные компоненты внутри значения атрибута : Спецификация XML определяет ряд возможных допустимых конструкций как типы атрибутов , включая IDREFS и NMTOKENS. Первый случай соответствует продукту Names , а второй случай соответствует продукту NMTokens ; обе эти продукции определены как содержащие несколько значений соответствующего типа, разделенных пробелами. Таким образом, списки значений, разделенные пробелами, как значение одного атрибута, являются неотъемлемым компонентом набора информации XML.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:variable name="foo0" select="false()"/>
  <xsl:variable name="bar0" select="true()"/>

  <xsl:variable name="foo1" select="true()"/>
  <xsl:variable name="bar1" select="false()"/>

  <xsl:variable name="foo2" select="true()"/>
  <xsl:variable name="bar2" select="true()"/>

  <xsl:template match="/">

    <xsl:variable name="foobar0">
      <xsl:if test="$foo0"> foo</xsl:if>
      <xsl:if test="$bar0"> bar</xsl:if>
    </xsl:variable>

    <xsl:variable name="foobar1">
      <xsl:if test="$foo1"> foo</xsl:if>
      <xsl:if test="$bar1"> bar</xsl:if>
    </xsl:variable>

    <xsl:variable name="foobar2">
      <xsl:if test="$foo2"> foo</xsl:if>
      <xsl:if test="$bar2"> bar</xsl:if>
    </xsl:variable>

    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar0)"/>
      </xsl:attribute>
    </li>
    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar1)"/>
      </xsl:attribute>
    </li>
    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar2)"/>
      </xsl:attribute>
    </li>

  </xsl:template>
</xsl:stylesheet>

РЕДАКТИРОВАТЬ: В дополнение к вопросу о пробелах, разделяющих дискретные компоненты в пределах значения атрибута: XML Spec определяет ряд возможных допустимых конструкций как типы атрибутов , включая IDREFS и NMTOKENS. Первый случай соответствует продукту Names , а второй случай соответствует продукту NMTokens ; обе эти продукции определены как содержащие несколько значений соответствующего типа, разделенных пробелами. Таким образом, списки значений с разделителями-пробелами в качестве значения одного атрибута являются неотъемлемым компонентом набора информации XML.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:variable name="foo0" select="false()"/>
  <xsl:variable name="bar0" select="true()"/>

  <xsl:variable name="foo1" select="true()"/>
  <xsl:variable name="bar1" select="false()"/>

  <xsl:variable name="foo2" select="true()"/>
  <xsl:variable name="bar2" select="true()"/>

  <xsl:template match="/">

    <xsl:variable name="foobar0">
      <xsl:if test="$foo0"> foo</xsl:if>
      <xsl:if test="$bar0"> bar</xsl:if>
    </xsl:variable>

    <xsl:variable name="foobar1">
      <xsl:if test="$foo1"> foo</xsl:if>
      <xsl:if test="$bar1"> bar</xsl:if>
    </xsl:variable>

    <xsl:variable name="foobar2">
      <xsl:if test="$foo2"> foo</xsl:if>
      <xsl:if test="$bar2"> bar</xsl:if>
    </xsl:variable>

    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar0)"/>
      </xsl:attribute>
    </li>
    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar1)"/>
      </xsl:attribute>
    </li>
    <li>
      <xsl:attribute name="class">
        <xsl:value-of select="normalize-space($foobar2)"/>
      </xsl:attribute>
    </li>

  </xsl:template>
</xsl:stylesheet>

РЕДАКТИРОВАТЬ: В дополнение к вопросу о пробелах, разделяющих дискретные компоненты в пределах значения атрибута: XML Spec определяет ряд возможных допустимых конструкций как типы атрибутов , включая IDREFS и NMTOKENS. Первый случай соответствует продукту Names , а второй случай соответствует продукту NMTokens ; обе эти продукции определены как содержащие несколько значений соответствующего типа, разделенных пробелами. Таким образом, списки значений с разделителями-пробелами в качестве значения одного атрибута являются неотъемлемым компонентом набора информации XML.

включая IDREFS и NMTOKENS. Первый случай соответствует продукту Names , а второй случай соответствует продукту NMTokens ; обе эти продукции определены как содержащие несколько значений соответствующего типа, разделенных пробелами. Таким образом, списки значений с разделителями-пробелами в качестве значения одного атрибута являются неотъемлемым компонентом набора информации XML.

включая IDREFS и NMTOKENS. Первый случай соответствует продукту Names , а второй случай соответствует продукту NMTokens ; обе эти продукции определены как содержащие несколько значений соответствующего типа, разделенных пробелами. Таким образом, списки значений, разделенные пробелами, как значение одного атрибута, являются неотъемлемым компонентом набора информации XML.

11
ответ дан 6 December 2019 в 10:01
поделиться

В моей голове вы можете создать список, разделенный пробелами, примерно так:

<li>
    <xsl:attribute name="class">
        <xsl:if cond="...">correct</xsl:if>
        <xsl:if cond="...">submitted</xsl:if>
  </xsl:attribute>
</li>
6
ответ дан 6 December 2019 в 10:01
поделиться

Насколько мне известно, значения атрибутов, разделенные пробелами, не являются частью модели данных XML и поэтому не могут быть созданы напрямую через XSLT

Если вы не выполняете преобразование в язык XML (которым HTML не является, XHTML является), вам не следует беспокоиться о достоверности XML вывода XSLT . Это может быть что угодно, и оно не обязательно должно соответствовать XML!

2
ответ дан 6 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: