我正在尝试在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>
由于
萨姆
答案 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)
|
不是“或”,它是一个运算符,用于组合两个节点集。因此,如果Name
和Attribution
都存在,则变量by
的值将是由这两个元素组成的节点集。现在,当你真正尝试在需要“值”的上下文中使用变量时 - 例如xsl:value-of
,使用文档顺序中节点集中第一个节点的值。在您的情况下,Attribution
可能始终位于文档的第一位,因此始终使用它。
解决方法是使用xsl:if
。
答案 2 :(得分:0)
这篇文章很老了,但问题仍然是最新的,所以也许这个答案很有意思:
<xsl:variable name="by" select="(Contributors/Contributor[Role='ReMixer']/Name | Attribution)[string-length(.) > 0]" />
也会奏效。
union运算符返回一个nodelist ...并且可以像往常一样过滤节点列表。