Подтвердить что ты не робот

XSL, если: тест с несколькими условиями тестирования

[решаемые]

Благодаря @IanRoberts мне пришлось использовать функцию normalize-space на моих узлах, чтобы проверить, были ли они пустыми.

<xsl:if test="((node/ABC!='') and (normalize-space(node/DEF)='') and (normalize-space(node/GHI)=''))">
  This worked perfectly fine.
</xsl:if>

[Проблема]

Я пытаюсь создать условие xsl, чтобы проверить, являются ли комбинации node пустыми или нет. Я пробовал ниже условий, но они не работают, кто-нибудь имеет представление о том, как заставить его работать.

<xsl:if test=" node/ABC!='' and node/DEF='' and node/GHI='' ">
This does not work
</xsl:if>

Я также пробовал

<xsl:when test="((node/ABC!='') and (node/DEF='') and (node/GHI=''))">
This does not work either..
</xsl:when>

А также попробовал

<xsl:if test="(node/ABC!='')>
<xsl:if test="(node/DEF='')>
<xsl:if test="(node/GHI='')">
Nope not working..
</xsl:if>
</xsl:if>
</xsl:if>

I, затем попытался с одним условием xsl: if, а ниже - наблюдение

<xsl:if test="node/ABC!=''>
**This is working fine**
</xsl:if>

Однако, если я попытаюсь выполнить поиск пустого условия, i.e

<xsl:if test="node/ABC=''>
**This does not work**
</xsl:if>

Кроме того, если я пытаюсь использовать == (double равно), то он дает ошибку xslt. то есть

<xsl:if test="node/ABC==''>
***This gives a compilation error***
</xsl:if>

Я хотел бы помочь в выяснении того, как получить мой тест xsl: if, проверяющий несколько условий. Спасибо заранее.

[Изменить]: просто обновить здесь, что условие if, где все узлы не являются пустыми, работает, но не работает, когда я пытаюсь проверить какой-либо другой node из трех пустых узлов.

Например,

<xsl:if test=" node/ABC!='' and node/DEF!='' and node/GHI!='' ">
This condition works perfectly fine.
</xsl:if>
4b9b3361

Ответ 1

Благодаря @IanRoberts мне пришлось использовать функцию normalize-space на моих узлах, чтобы проверить, были ли они пустыми.

<xsl:if test="((node/ABC!='') and (normalize-space(node/DEF)='') and (normalize-space(node/GHI)=''))">
  This worked perfectly fine.
</xsl:if>

Ответ 2

Попробуйте использовать функцию empty():

<xsl:if test="empty(node/ABC/node()) and empty(node/DEF/node())">
    <xsl:text>This should work</xsl:text>
</xsl:if>

Это идентифицирует ABC и DEF как пустые в том смысле, что у них нет дочерних узлов (нет элементов, нет текстовых узлов, нет инструкций по обработке, нет комментариев).

Но, как указывает @Ian, ваши элементы могут быть не пустыми или это может быть не ваша фактическая проблема - вы не указали, как выглядит ваш входной XML.

Другой причиной ошибки может быть ваше относительное положение в дереве. Этот способ тестирования работает только в том случае, если окружающий шаблон соответствует родительскому элементу node или если вы перебираете родительский элемент node.