xslt значение-приоритет союза - PullRequest
2 голосов
/ 14 сентября 2010

Я пытаюсь установить переменную в XSLT 1.0 следующим образом

 <xsl:variable name="by" select="Contributors/Contributor[Role='ReMixer']/Name | Attribution" />

Идея состоит в том, что если роль Remixer не завершается, переменная принимает значение Attribution, однако при тестировании она всегда принимает значение Attribution независимо от этого.

есть идеи, почему это происходит, и решение?

обновление 1

Это то, чем я сейчас занимаюсь

<xsl:variable name="Remixer" select="Contributors/Contributor[Role='ReMixer']/Name" />
      <xsl:variable name="by">
            <xsl:choose>
                  <xsl:when test="$Remixer = ''">
                        <xsl:value-of select="Attribution"/>
                  </xsl:when>
                  <xsl:otherwise>
                        <xsl:value-of select="$Remixer"/>
                  </xsl:otherwise>
            </xsl:choose>
      </xsl:variable>

Был бы более короткий способ добиться тех же результатов?

ниже - копия документа xml

<track>
      <attribution>Various Artists</attribution>
      <contributors>
            <contributor primary="true">
                  <role>Recording Artist</role>
                  <name country="" birth-deathyear="" part3="Cosmic Gate" part2="" part1="">Cosmic Gate</name>
            </contributor>
            <contributor primary="true">
                  <role>ReMixer</role>
                  <name country="" birth-deathyear="" part3="Gary Gee" part2="" part1="">Gary Gee</name>
            </contributor>
      </contributors>
</track>

Спасибо

Sam

Ответы [ 3 ]

4 голосов
/ 14 сентября 2010

Правильный способ использования этой идиомы: :

       $n1[$condition] | $n2[not($condition)]

выбирает узел $n1 если $condition равен true () и выбирает $n2 если $conditionfalse().

Итак, в вашем случае это будет :

       Contributors/Contributor[Role='ReMixer']/Name
| 
       Attribution[not(../Contributors/Contributor[Role='ReMixer'])]
3 голосов
/ 14 сентября 2010

| в XSLT - это не «или», это оператор для объединения двух наборов узлов.Таким образом, если существуют и Name, и Attribution, значение переменной by будет набором узлов, состоящим из этих двух элементов.Теперь, когда вы на самом деле пытаетесь использовать переменную в контексте, где требуется «значение» - например, xsl:value-of, используется значение первого узла в наборе узлов в порядке документов .В вашем случае Attribution, вероятно, всегда стоит на первом месте в документе, поэтому и используется всегда.

Обходной путь должен использовать xsl:if.

0 голосов
/ 27 ноября 2013

Это сообщение довольно старое, но вопрос все еще актуален, поэтому, возможно, этот ответ в любом случае интересен:

<xsl:variable name="by" select="(Contributors/Contributor[Role='ReMixer']/Name | Attribution)[string-length(.) &gt; 0]" />

тоже будет работать.

Оператор объединения возвращает список узлов ... и список узлов можно фильтровать как обычно.

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