2012-02-14 2 views
1

Как определить, присутствует ли данный узел в моем вводе xml?Как определить, присутствует ли узел при трансформации Xsl?

Если узел присутствует, я хотел бы использовать значение reportAuthor1, но в противном случае я бы использовал значение reportAuthor. Я безуспешно пытался использовать if и else.

<xsl:choose> 
<xsl:when test="reportAuthor1=''"> 
<xsl:value-of select="reportAuthor"/> 
</xsl:when> 
<xsl:otherwise> 
<xsl:value-of select="reportAuthor1"/> 
</xsl:otherwise> 
</xsl:choose> 

ответ

5

Используйте not(), чтобы проверить, является ли узел не существует вообще:

<xsl:choose> 
    <xsl:when test="not(reportAuthor1)"> 
    <xsl:value-of select="reportAuthor"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="reportAuthor1"/> 
    </xsl:otherwise> 
</xsl:choose> 
+0

Спасибо, что работает для меня. – udaya726

1

В данном конкретном случае, вы можете также написать

<xsl:value-of select="reportAuthor1 | reportAuthor"/> 

| возвращает объединение множеств возвращенный запросами XPath слева и справа от этого оператора, а <xsl:value-of select="somequery"/> отправит на выход значение первого узла в набор, возвращаемый somequery. Таким образом, если установлены оба значения reportAuthor1 и reportAuthor, он выдаст значение reportAuthor1; если установлен только reportAuthor, он выдаст значение reportOutput.

+0

Спасибо за быстрый ответ. Я попробовал предыдущее решение. Попробую это также. – udaya726

+0

Aaah, мой комментарий был испорчен парсером изначально, нельзя забывать пустую строку! Мой пример кода похож на ответ Димитрия Новачева, несмотря на то, что он медленнее ('reportAuthor' будет вычисляться, даже если есть' reportAuthor1'). С другой стороны, XSLT-процессор должен быть достаточно умным, чтобы не вычислять 'reportAuthor' в такой ситуации. – penartur

+3

Одна из проблем с использованием оператора union, а не '' заключается в том, что он выбирает в зависимости от того, что наступит раньше в XML, поэтому, если элемент 'reportAuthor' предшествует' reportAuthor1', он будет использовать это, хотя 'reportAuthor1' является первым в предложение select. Вы можете уменьшить это с помощью 'reportAuthor1 | reportAuthor [not (../ reportAuthor1)] ', который будет выбирать только элемент' reportAuthor', если у него нет слова 'reportAuthor1' (xpath указывает, что у родителя нет дочернего элемента reportAuthor1). – Flynn1179

3

Это, вероятно, самое простое и кратчайшее однострочное выражение XPath. Использовать:

<xsl:value-of select="reportAuthor1 | reportAuthor[not(reportAuthor1)]"/> 
Смежные вопросы