Заполнение переменной с помощью xsl select - PullRequest
3 голосов
/ 18 февраля 2012
<xsl:template match="/">
      <xsl:variable name="a" select="'a'"/>
      <xsl:variable name="b" select="'b'"/>
      <xsl:variable name="c" select="'c'"/>
      <xsl:variable name="result">
        <xsl:choose>
          <xsl:when test="$a !=''">
            <xsl:value-of select="$a"/>
          </xsl:when>
          <xsl:when test="$b !=''">
            <xsl:value-of select="$b"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$c"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:variable>

Переменная результата заполнена, здесь я использовал операторы выбора xsl.Я просто хотел узнать, есть ли другой эффективный или простой способ заполнения переменной результата, основанный на той же логике, что и xsl, выбирайте.

Примерно так:

<xsl:variable name="result" select="$a | $b | $c" />

.работать для наборов узлов, а не для переменных.Любые входы? XSL 1,0

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

Примерно так

<xsl:variable name="result" select="$a | $b | $c" /> 

Выше будет работать для наборов узлов, а не для переменных. Любые входы? XSL 1,0

Это неправильно! Вышеуказанная переменная result определена так, чтобы содержать объединение трех наборов узлов, а не только одного из них, в зависимости от того, являются ли некоторые другие из них пустыми .

В этом случае правильное выражение XPath: :

$a | $b[not($a)] | $c[not($a | $b)]

Когда эти три переменные не являются наборами узлов, а являются строками, и если эти строковые значения могут иметь любую длину (не только длину 1), соответствующее выражение XPath аналогично:

concat($a, 
       substring($b, 1 div ($a = '')), 
       substring($c, 1 div (concat($a, $b) = ''))
       )

Здесь мы используем тот факт, что:

substring($s, $k) - пустая строка ''

всякий раз, когда

$k >= string-length($s)

и

substring($s, 1) = $s

Также:

1 div false()

is positive Infinity

(false() преобразуется в 0 при использовании в арифметических операциях).

и по определению

positive Infinity > $k

за каждое целое число $k.

Таким образом,

substring($s, 1 div $somethingFalse) = ''

и

substring($s, 1 div $somethingTrue) = $s

Наконец, , если гарантируется, что три переменные $a, $b и $c могут иметь в качестве значения только один символ, чем мы можем использовать просто:

substring(concat($a, $b, $c), 1, 1)
1 голос
/ 18 февраля 2012

Хорошо, если переменные связаны с наборами узлов, то $a | $b | $c дает объединение этих наборов узлов, а не альтернативу, поэтому я не уверен, что вы хотите объяснить, представив этот пример.

В вашем первом примере кода у вас есть три переменные со значениями типа string, где каждая содержит один символ, поэтому вы можете сделать <xsl:variable name="result" select="substring(concat($a, $b, $c), 1, 1)"/>, если вы ожидаете найти только один символ или пустую строку и хотите найти самый первый символ в «наборе» переменных. Но в целом XSLT 1.0 может потребовать подробного xsl:choose/when/otherwise кодирования.

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