XPath/XSLT/Axes выбирают всех братьев и сестер, включая себя

Мне кажется логичным, что была бы легкая ось или что-то еще, чтобы выбрать текст всех братьев и сестер, включая себя, но я не могу найти его.

XML:

<panelTabs>
 <field></field>
 <field></field>
</panelTabs>

Сейчас я нахожусь в <xsl:template match="panelTabs/field>, и мне нужно быть в этом шаблоне. Я хочу проверить, все ли значения в каждом <field> пусты. Как мне это сделать?

Изменить:
Чтобы быть немного более конкретным. Я бы хотел, чтобы мой XSLT был примерно таким:

<xsl:template match="panelTabs/field>
 <xsl:if test="allfieldshaventgottext = true">
  <p>All are empty</p>
 </xsl:if>
 <xsl:if test="thereisafieldwithtext = true">
  <p>There is a field with text</p>
 </xsl:if>
</xsl:template>

Вместо xsl:if подойдет xsl:when

EDIT:
Я создал новый, более объясненный вопрос. Я здесь: XPath/XSLT выбирает всех братьев и сестер, включая самого себя


person Grafit    schedule 10.12.2014    source источник


Ответы (2)


Вы можете использовать ../* для выбора всех братьев и сестер, включая текущий элемент (или ../field для выбора field элементов).

Итак, в вашем случае вы можете сделать:

<xsl:template match="panelTabs/field">
 <xsl:if test="not(../field[normalize-space()])">
  <p>All are empty</p>
 </xsl:if>
 <xsl:if test="../field[normalize-space()]">
  <p>There is a field with text</p>
 </xsl:if>
</xsl:template>

Пример с некоторыми непустыми

Пример без полей

Однако было бы более идиоматично использовать сопоставление с образцом:

<xsl:template match="panelTabs/field">
  <p>All are empty</p>
</xsl:template>

<xsl:template match="panelTabs[field[normalize-space()]]/field" priority="2">
  <p>There is a field with text</p>
</xsl:template>

Пример с некоторыми непустыми

Пример без полей

Если вы хотите только один раз проверить, все ли поля пусты, вы можете сделать это:

<xsl:template match="panelTabs[not(field[normalize-space()])]">
  <p>All are empty</p>
</xsl:template>

<xsl:template match="panelTabs/field">
  <p><xsl:value-of select="." /></p>
</xsl:template>

<xsl:template match="panelTabs/field[not(normalize-space())]" priority="2" />
person JLRishe    schedule 10.12.2014
comment
Первое решение, похоже, не работает. Он ничего не возвращает, хотя должен что-то возвращать. Я забыл сказать, что между тегами полей может быть пробел. <field> </field>. Я попробую второе решение. - person Grafit; 10.12.2014
comment
Если между ними есть пространство, то normalize-space() позаботится об этом. string() не будет. - person JLRishe; 10.12.2014
comment
Решения не работают. Проблема в том, что он возвращает <p>All are empty</p> два раза. - person Grafit; 10.12.2014
comment
@Grafit, который подходит для заданного вами вопроса - шаблон срабатывает один раз для каждого field и выводит <p>All are empty</p>, если все родственные поля пусты. Если вам нужен только один пустой ответ на панельВкладки, а не один ответ на поле, вам нужно переместить if на другой уровень. - person Ian Roberts; 10.12.2014
comment
@IanRoberts Вы правы, мой вопрос был неправильным. Я подвину его на один шаблон вверх. - person Grafit; 10.12.2014
comment
@Grafit В моем втором примере была ошибка (содержимое шаблонов было наоборот). Если вы хотите отобразить «Все пусто» только один раз, я изменил свой ответ, чтобы показать, как это сделать. - person JLRishe; 10.12.2014
comment
@JLRishe Это все еще не делает то, что я хотел. Я создам новый вопрос с дополнительным объяснением. Тем не менее, большое спасибо за вашу помощь! - person Grafit; 11.12.2014

Если вы отметите not(../field[not(normalize-space())]), то вы знаете, что нет поля, которое было бы пустым или просто содержало пробелы.

person Martin Honnen    schedule 10.12.2014