XSLT: получить элемент, содержащий определенную строку, или первый элемент, если он отсутствует - PullRequest
2 голосов
/ 12 августа 2010

У меня есть XML список"устройств".

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

Используя XSLT , я хочу получить сначала "HTC *"устройство , если оно есть, или первое устройство , если нет устройств HTC.

Какой код XSLT сделает это?
Спасибо!

Ответы [ 2 ]

1 голос
/ 12 августа 2010

Используйте этот однострочный XPath :

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

Обычно , для выбора узла $n1, когда некоторое $condition равно true(), и для выбора узла $n2, когда это условие false():

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

Объяснение

Вышеприведенное выражение является объединением (|) двух подвыражений, из которых только одно выбирает узел, в зависимости от значения конкретного $condition.

Наконец , в XSLT вы будете использовать это выражение XPath так:

  <xsl:apply-templates select=
   "  /*/device[starts-with(., 'HTC')][1] 
    | 
      /*/device[1][not(/*/device[starts-with(., 'HTC')])]
   "/>
1 голос
/ 12 августа 2010

Вот одна возможность (протестировано с 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...