Условия XSLT / переменный объем

<xsl:choose>
    <xsl:when test="long convoluted expression">
        <xsl:element name="Class">123</xsl:element>
        <a lot more xsl:elements>
    </xsl:when>
    <xsl:when test="next very long expression">
        <xml:element name="Class">124</xsl:element>
        <a lot more xsl:elements>
    </xsl:when>
    <tens of more similar xsl:when>
</xsl:choose>

Существует ли способ упростить вышеупомянутый код с условными выражениями? Поскольку каждое значение класса, которое даны объекты, там следует за десятками строк с дополнительными атрибутами. Эти атрибуты формируют наборы согласно значению класса. Класс 0-99 имеет один набор дополнительных тегов, класс 100-199 секунда, формируя кошмар обслуживания, когда один из этих дополнительных наборов тегов изменяется.

Я рассматривал решение как это:

<xsl:choose>
    <xsl:when test="long convoluted expression">
        <xml:element name="Class">123</xsl:element>
        <xsl:variable name="outputclass" select="123">
    </xml:when>
    <xsl:when test="next very long expression">
        <xml:element name="Class">124</xsl:element>
        <xsl:variable name="outputclass" select="124">
    </xsl:when>
</xsl:choose>
<xsl:choose>
    <xsl:when test="$outputclass > 99">
        <xml:elements for classes 100-199 here>
    </xsl:when>
<xsl:choose>

Но конечно это перестало работать, поскольку outputclass переменная не находится в том же объеме. Какой-либо способ обойти это?

6
задан diskis 2 July 2010 в 12:20
поделиться

3 ответа

Лучшее решение этой проблемы хорошо известно :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
    <xsl:variable name="voutType">
      <xsl:choose>
        <xsl:when test="long convoluted expression">123</xsl:when>
        <xsl:when test="next very long expression">124</xsl:when>
        <!-- Etcetera ... -->
      </xsl:choose>
    </xsl:variable>

   <Class><xsl:value-of select="$voutType"</Class>
         <xsl:choose>
            <xsl:when test="not($voutType > 99)">
                <!-- elements for classes 0 - 99 here -->
            </xsl:when>
            <xsl:otherwise>
                <!-- elements for classes 100-199 here -->
            </xsl:otherwise>
         <xsl:choose>
 </xsl:template>
</xsl:stylesheet>

Обратите внимание на :

  1. Чтобы присвоить значения переменной ( $ voutType ), инструкция должна быть внутри тела

  2. Вам нужно только указать элемент один раз - вне всего остального.

  3. Вам не нужно использовать , если известно имя элемента .

6
ответ дан 17 December 2019 в 00:02
поделиться

Если вы пытаетесь упростить задание нескольких атрибутов (, а не тегов, или элементов!), То мне кажется, что наборы атрибутов - это то, что вы нужны, и вам могут не понадобиться переменные:

http://www.w3.org/TR/xslt#attribute-sets

Это предполагает, что сами значения атрибутов не зависят от значения класса; есть только их присутствие.

Если элементы действительно то, что вы имеете в виду, попробуйте использовать именованные шаблоны с входным параметром. На верхнем уровне вашей таблицы стилей:

<xsl:template name="classdef">
  <xsl:param name="classid"/>
  <!-- Note: I put the class elem in here so I don't have to
        write individual class ids more than once -->
  <xsl:element name="Class"><xsl:value-of select="$classid"/></xsl:element>
  <xsl:choose>
    <xsl:when test="$classid > 99">
      ...
    </xsl:when>
  </xsl:choose>
</xsl:template>

и в другом вашем шаблоне:

<xsl:call-template name="classdef">
  <xsl:with-param name="classid">124</xsl:with-param>
</xsl:call-template>

См. http://www.w3.org/TR/xslt#variables для получения дополнительной информации о параметрах.

1
ответ дан 17 December 2019 в 00:02
поделиться

Я делал XSLT всего несколько раз, но каждый раз это кажется огромным кошмаром обслуживания. В любом случае, я думаю, вы могли бы установить переменную, указывающую, что это за класс, а затем вызвать функцию как xsl: template, совпадающую с классом как arg. Вы бы объявили эту функцию как xsl: template name, потому что вы не хотите, чтобы она соответствовала автоматически. Внутри функции вы должны иметь возможность записать эти 100 значений. Не уверен, помогает ли это, но код организован таким образом, чтобы это могло.

0
ответ дан 17 December 2019 в 00:02
поделиться
Другие вопросы по тегам:

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