XSLT:检索包含特定字符串的元素,如果不存在则检索第一个元素

时间:2010-08-12 03:17:06

标签: xslt xpath

我有一个 XML列表的“设备”。

<devices>
  <device>NOKIA-43</device>
  <device>HTC-7</device>
  <device>SAMSUNG-376</device>
<devices>

使用 XSLT ,我想检索第一个“HTC *”设备(如果有)或第一个设备(如果有)没有HTC设备。

XSLT代码会做什么?
谢谢!

2 个答案:

答案 0 :(得分:1)

这是一种可能性(使用Oxygen / XML测试):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:template match="//devices">
        <xsl:choose>
            <xsl:when test="device[starts-with(text(),'HTC')]">
                <xsl:apply-templates select="device[starts-with(text(),'HTC')][position()=1]"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="device[position()=1]"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template match="device">
        <xsl:value-of select="text()"/>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

使用此XPath单行

  /*/device[starts-with(., 'HTC')][1] 
| 
  /*/device[1][not(/*/device[starts-with(., 'HTC')])]

通常在某些$n1$condition时选择节点true(),并在此条件为{时选择节点$n2 {1}}

false()

<强>解释

上面的表达式是两个子表达式的并集( $n1[$condition] | $n2[not($condition)] ),其中只有一个选择一个节点,具体取决于特定|的值。

终于,在XSLT中,我将使用这样的XPath表达式:

$condition