XSLT: тестовый параметр, чтобы узнать, был ли он установлен - PullRequest
7 голосов
/ 13 июля 2009

У меня есть ситуация, когда параметр не будет установлен, но мои попытки поймать и обработать положение не работают.

Я использую следующее:

<xsl:template match="xs:complexType">
  <xsl:param name="prefix" />

  <xsl:variable name="prefix-no-core">
    <xsl:choose>
      <!-- if no value, default to 'AcRec' -->
      <xsl:when test="not($prefix)"> 
        <xsl:value-of select="'AcRec'" />
      </xsl:when>
      <!-- if 'core', leave as empty string -->
      <xsl:when test="$prefix = 'core'">
      </xsl:when>
      <!-- if 'AcRec', set the value -->
      <xsl:when test="$prefix = 'AcRec'">
        <xsl:value-of select="$prefix" />
      </xsl:when>               
    </xsl:choose>
  </xsl:variable>

  <xs:complexType name="{concat($prefix-no-core, @name)}">
  ...
</xsl:template>

Я также пробовал $ prefix = '' в первом тесте - тоже не работает. но если я использую:

<xsl:value-of select="not($prefix)" />

... значение выводится как true. Но использование этого в моем xsl: select не приводит к выводу.

Ответы [ 4 ]

8 голосов
/ 01 мая 2011

Вы можете указать значение по умолчанию для параметра, поэтому, когда он не передан, вы можете проверить его.

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

<xsl:template match="xs:complexType">
  <xsl:param name="prefix" select="'default-value'" /> <!-- SET default -->

  <xsl:variable name="prefix-no-core">
    <xsl:choose>
      <!-- if no value, default to 'AcRec' -->
      <xsl:when test="$prefix = 'default-value'"> 
        <xsl:value-of select="'AcRec'" />
      </xsl:when>
      <!-- if 'core', leave as empty string -->
      <xsl:when test="$prefix = 'core'">
      </xsl:when>
      <!-- if 'AcRec', set the value -->
      <xsl:when test="$prefix = 'AcRec'">
        <xsl:value-of select="$prefix" />
      </xsl:when>                       
    </xsl:choose>
  </xsl:variable>

  <xs:complexType name="{concat($prefix-no-core, @name)}">
  ...
</xsl:template>

Вызовите так, и значение будет 'default-value':

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" />

Вызовите вот так, и значение будет «передано»:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']">
    <xsl:with-param name="prefix" value="'passed-value'"/>
</xsl:apply-templates>

РЕДАКТИРОВАТЬ: Для полноты, упрощенная форма исходного примера:

<xsl:template match="xs:complexType">
  <xsl:param name="prefix" select="'AcRec'"/>

  <xsl:variable name="prefix-no-core">
    <xsl:choose>
      <!-- if 'core', leave as empty string -->
      <xsl:when test="$prefix = 'core'">
      </xsl:when>
      <!-- defaults to 'AcRec' -->
      <xsl:otherwise>
        <xsl:value-of select="$prefix" />
      </xsl:otherwise>                       
    </xsl:choose>
  </xsl:variable>

  <xs:complexType name="{concat($prefix-no-core, @name)}">
  ...
</xsl:template>
1 голос
/ 13 июля 2009

Это хак, но я добился успеха, предварительно обернув параметр функцией normalize-space (), прежде чем проверять пустой параметр.

<xsl:value-of select="not(normalize-space($prefix))" />
1 голос
/ 13 июля 2009

Примечание: заменил старый ответ, проверьте историю, если хотите.

Следующий ввод:

<test xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="something"/>
    <xs:complexType name="somethingElse"/>
</test>

ФРС на следующий XSLT:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0">
    <xsl:template match="/">
        <xsl:for-each select="node()">
            <xsl:apply-templates/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="xs:complexType">
        <xsl:param name="prefix" />
        <xsl:variable name="prefix-no-core">
            <xsl:choose>
                <xsl:when test="not($prefix)">AcRec</xsl:when>
                <xsl:when test="$prefix = 'core'"/>
                <xsl:when test="$prefix = 'AcRec'">AcRec</xsl:when>                       
            </xsl:choose>
        </xsl:variable>

        <xs:complexType name="{concat($prefix-no-core, @name)}"/>
    </xsl:template>
</xsl:transform>

Дает следующий результат:

<xs:complexType name="AcRecsomething" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
<xs:complexType name="AcRecsomethingElse" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>

Я не уверен, что еще ты ищешь ...

0 голосов
/ 14 июля 2009

Из предложений, сделанных на сегодняшний день, единственное решение, которое работало, состояло в том, чтобы всегда устанавливать значение параметра при обращении к шаблону. Например, ранее у меня было:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']" />

Это должно было быть изменено на:

<xsl:apply-templates select="//xs:complexType[@name='AddressType']">
  <xsl:with-param name="prefix" select="'AcRec'" />
</xsl:apply-templates>

Мне бы очень хотелось знать, почему не ($ param) и $ param = '' не работают в тесте WHEN, но я могу получить значение not ($ param) в xsl: value-of заявление.

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