Условия XSLT / область действия переменной - PullRequest
6 голосов
/ 02 июля 2010
<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>

Но, конечно, это не так, поскольку переменная выходного класса не находится в той же области видимости. Есть ли способ обойти это?

Ответы [ 3 ]

6 голосов
/ 02 июля 2010

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

<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), инструкция <xsl:choose> должна быть внутри тела <xsl:variable>

  2. Вам необходимо указать элемент <Class> только один раз - вне всего остального.

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

1 голос
/ 02 июля 2010

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

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 для получения дополнительной информации о параметрах.

0 голосов
/ 02 июля 2010

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

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