3

我想获得两个的第一个非空值并将其放入文本输入的“值”属性中。所以,我这样做:

<input type="text">
  <xsl:attribute name="value">
    <xsl:choose>
      <xsl:when test="some/@attr != ''">
        <xsl:value-of select="some/@attr" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="some/another/@attr" /> <!-- always non-empty, so get it -->
      </xsl:otherwise>
    </xsl:choose>
  </xsl:attribute>
</input>

问题是:有没有办法用更少的代码行?..也许,像那样:<input type="text" value="some/@attr or some/another/@attr" />或者什么?..就像在 Perl 中:my $val = 0 || 5;

在此先感谢您的帮助

UPD XSLT 1.0

4

3 回答 3

6

如果你使用

<xsl:attribute name="value">
  <xsl:value-of select="some/@attr[. != ''] | some/another/@attr"/>
</xsl:attribute>

然后使用 XSLT 1.0语义输出value-of选择的第一个节点的字符串值。some/@attr[. != ''] | some/another/@attr因此,如果some/@attr[. != '']选择一个节点,它应该被输出,否则some/another/@attr(我认为在文档顺序中some/@attr被认为是前面的)。some/child-element/@attr

于 2013-04-20T09:11:46.537 回答
3

甚至可以避免联合

<input type="text" 
       value="{some/@attr[string(.)]}{some[not(string(@attr))]/another/@attr}">
</input>

在这里,我们还避免了所有其他给定答案共有的两个属性的优先级依赖性——我们不假设第一个属性在文档顺序中位于第二个属性之前。

我们可以编写这个等效的代码,颠倒两个 AVT 的顺序

<input type="text" 
       value="{some[not(string(@attr))]/another/@attr}{some/@attr[string(.)]}">
</input>
于 2013-04-21T16:18:46.660 回答
1

接力魔术已经在@Martin Honnen 的答案中。作为增强,为了让它更短一点,你可以使用“属性值模板”

<input type="text" value="{some/@attr[. != ''] | some/another/@attr}">
</input>
于 2013-04-20T09:48:13.430 回答