联合优先级的xslt值

时间:2010-09-14 08:54:26

标签: xslt xpath

我正在尝试在XSLT 1.0中设置一个变量,如下所示

 <xsl:variable name="by" select="Contributors/Contributor[Role='ReMixer']/Name | 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 doccument的副本

<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>

由于

萨姆

3 个答案:

答案 0 :(得分:4)

使用此习语的正确方法是

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

如果$n1$condition,则选择节点true (),如果$n2$condition,则选择false()

因此,在您的情况下,这将是

       Contributors/Contributor[Role='ReMixer']/Name
| 
       Attribution[not(../Contributors/Contributor[Role='ReMixer'])]

答案 1 :(得分:3)

XSLT中的

|不是“或”,它是一个运算符,用于组合两个节点集。因此,如果NameAttribution都存在,则变量by的值将是由这两个元素组成的节点集。现在,当你真正尝试在需要“值”的上下文中使用变量时 - 例如xsl:value-of,使用文档顺序中节点集中第一个节点的值。在您的情况下,Attribution可能始终位于文档的第一位,因此始终使用它。

解决方法是使用xsl:if

答案 2 :(得分:0)

这篇文章很老了,但问题仍然是最新的,所以也许这个答案很有意思:

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

也会奏效。

union运算符返回一个nodelist ...并且可以像往常一样过滤节点列表。