XSL проверить длину параметра и сделать выбор

Мне нужно проверить, есть ли в параметре значение, и если оно есть, то выполните эту строку, иначе выполните эту строку.

У меня это работает, хотя я не получаю ошибок, но это не правильная ветвь

Неверная ветвь находится в шаблоне волонтера_роли.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="volunteers-by-region" match="volunteer" use="region" />
  <xsl:template name="hoo" match="/">
    <html>
      <head>
        <title>Registered Volunteers</title>
        <link rel="stylesheet" type="text/css" href="volunteer.css" />
      </head>
      <body>
        <h1>Registered Volunteers</h1>
        <h3>Ordered by the username ascending</h3>
        <xsl:for-each select="folktask/member[user/account/userlevel='2']">
          <xsl:for-each select="volunteer[count(. | key('volunteers-by-region', region)[1]) = 1]">
            <xsl:sort select="region" />
            <xsl:for-each select="key('volunteers-by-region', region)">
              <xsl:sort select="folktask/member/user/personal/name" />
                <div class="userdiv">
                  <xsl:call-template name="volunteer_volid">
                    <xsl:with-param name="volid" select="../volunteer/@id" />
                  </xsl:call-template>
                  <xsl:call-template name="volunteer_role">
                    <xsl:with-param name="volrole" select="../volunteer/roles" />
                  </xsl:call-template>
                  <xsl:call-template name="volunteer_region">
                    <xsl:with-param name="volloc" select="../volunteer/region" />
                  </xsl:call-template>
                </div>
              </xsl:for-each>
            </xsl:for-each>
          </xsl:for-each>
          <xsl:if test="position()=last()">
            <div class="count">
              <h2>Total number of volunteers: <xsl:value-of select="count(/folktask/member/user/account/userlevel[text()=2])" />
              </h2>
            </div>
          </xsl:if>
        </body>
      </html>
    </xsl:template>

    <xsl:template name="volunteer_volid">
      <xsl:param name="volid" select="'Not Available'" />
      <div class="heading2 bold"><h2>VOLUNTEER ID: <xsl:value-of select="$volid" /></h2></div>
    </xsl:template>

    <xsl:template name="volunteer_role">
      <xsl:param name="volrole" select="'Not Available'" />
      <div class="small bold">ROLES:</div>
      <div class="large">
      <xsl:choose>
        <xsl:when test="string-length($volrole)!=0">
          <xsl:value-of select="$volrole" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:text> </xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </div>
  </xsl:template>

  <xsl:template name="volunteer_region">
    <xsl:param name="volloc" select="'Not Available'" />
    <div class="small bold">REGION:</div>
    <div class="large"><xsl:value-of select="$volloc" /></div>
  </xsl:template>
</xsl:stylesheet> 

И XML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="volunteers.xsl"?>
<folktask xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="folktask.xsd">
  <member>
    <user id="1">
      <personal>
        <name>Abbie Hunt</name>
        <sex>Female</sex>
        <address1>108 Access Road</address1>
        <address2></address2>
        <city>Wells</city>
        <county>Somerset</county>
        <postcode>BA5 8GH</postcode>
        <telephone>01528927616</telephone>
        <mobile>07085252492</mobile>
        <email>[email protected]</email>
      </personal>
      <account>
        <username>AdRock</username>
        <password>269eb625e2f0cf6fae9a29434c12a89f</password>
        <userlevel>4</userlevel>
        <signupdate>2010-03-26T09:23:50</signupdate>
      </account>
    </user>
    <volunteer id="1">
      <roles></roles>
      <region>South West</region>
    </volunteer>
  </member>
  <member>
    <user id="2">
      <personal>
        <name>Aidan Harris</name>
        <sex>Male</sex>
        <address1>103 Aiken Street</address1>
        <address2></address2>
        <city>Chichester</city>
        <county>Sussex</county>
        <postcode>PO19 4DS</postcode>
        <telephone>01905149894</telephone>
        <mobile>07784467941</mobile>
        <email>[email protected]</email>
      </personal>
      <account>
        <username>AmbientExpert</username>
        <password>8e64214160e9dd14ae2a6d9f700004a6</password>
        <userlevel>2</userlevel>
        <signupdate>2010-03-26T09:23:50</signupdate>
      </account>
    </user>
    <volunteer id="2">
      <roles>Van Driver,gas Fitter</roles>
      <region>South Central</region>
    </volunteer>
  </member>
</folktask>

person AdRock    schedule 22.04.2010    source источник
comment
Ваш выбор/когда/иначе кажется мне правильным. каков ваш вклад? Вы всегда можете проверить, вставив что-то вроде ‹xsl:message select=string-length($volrole) /›, а затем посмотреть на результат.   -  person topskip    schedule 22.04.2010
comment
Куда мне это положить? Я помещаю его сразу после имени параметра или между когда и получаю сообщение об ошибке Ошибка загрузки таблицы стилей: не удалось выполнить синтаксический анализ таблицы стилей XSLT.   -  person AdRock    schedule 22.04.2010
comment
Я поставил его сразу после параметра (перед div). Вы используете XSLT 1.0? Я пробовал с XSLT 2.0.   -  person topskip    schedule 22.04.2010
comment
Я понятия не имею, какой XSLT я использую... не так давно этим занимаюсь. Вот я тоже поставил. Узел, который может быть пустым, это ‹roles›‹/roles› Похоже, он думает, что он не пуст.   -  person AdRock    schedule 22.04.2010
comment
Не могли бы вы опубликовать полный пример? Как исходного файла, так и файла XSLT. Номер версии указан в начале файла XSLT (‹xsl:stylesheet version=... xmlns:xsl=... /›   -  person topskip    schedule 22.04.2010
comment
Опубликовал мой пример с образцом xml и XSLT   -  person AdRock    schedule 22.04.2010
comment
Я задал здесь новый вопрос, где вы можете увидеть весь XSLT и XML stackoverflow.com/questions/2690520/how-to-group-using-xslt   -  person AdRock    schedule 22.04.2010
comment
Тогда этот вопрос должен быть закрыт. Нужно еще три голоса.   -  person Dimitre Novatchev    schedule 22.04.2010
comment
Эта проблема до сих пор не решена. У меня проблема отсортирована с моим другим вопросом, но эта проблема все еще возникает. Я перепоказал код, но полностью   -  person AdRock    schedule 23.04.2010
comment
Разобрался с этой проблемой. В коде не было ничего плохого, но он не отображал пустое пространство должным образом. Добавил ¢ или что-то еще, и это исправлено   -  person AdRock    schedule 23.04.2010


Ответы (1)


Следующее должно помочь:

<xsl:template name="volunteer_volid">
  <xsl:param name="volid" />
  <xsl:choose>
    <xsl:when test="string-length($volid) > 0">
      <div class="heading2 bold"><h2>VOLUNTEER ID: <xsl:value-of select="$volid" /></h2></div>  
    </xsl:when>
    <xsl:otherwise>
      <!-- No volid -->
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Я заменил значение по умолчанию пустой строкой, так что непредоставление значения параметра равносильно предоставлению значения параметра как "". Если это нежелательное поведение, измените параметры select и соответствующим образом измените выражение test, например:

$volid != 'Not Available'
person Justin    schedule 08.07.2011