Логика BI Publisher для проверки существования в группе

Я работаю с RTF-шаблоном PeopleSoft BI Publisher и буду работать с XML-документом с несколькими строками, как показано ниже:

<?xml version='1.0'?>
<query numrows="3" queryname="GH3_HRS_OFFER_DS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="">
<row rownumber="1">
<A.ERNCD/>
<A.EARNS_AMT>0</A.EARNS_AMT>
<A.OFFER_COMPONENT><![CDATA[BASSAL]]></A.OFFER_COMPONENT>
</row>
<row rownumber="2">
<A.ERNCD/>
<A.EARNS_AMT>0</A.EARNS_AMT>
<A.OFFER_COMPONENT><![CDATA[PROB]]></A.OFFER_COMPONENT>
</row>
<row rownumber="3">
<A.ERNCD/>
<A.EARNS_AMT>0</A.EARNS_AMT>
<A.OFFER_COMPONENT><![CDATA[SIGNON]]></A.OFFER_COMPONENT>
</row>
</query>

Что мне нужно сделать, так это отобразить 1-й абзац, если в данных есть строка с OFFER_COMPONENT = 'PROB', и я думаю, что это работает нормально для первого абзаца.

Однако я хочу, чтобы это функционировало так, чтобы отображался либо первый абзац выше, либо или второй абзац (<?if@inlines:A.OFFER_COMPONENT<>'PROB'?>), но не оба.

Я не думаю, что то, как я закодировал второй абзац <?if@inlines:A.OFFER_COMPONENT<>'PROB'?>), предотвратит отображение этого абзаца, поскольку, как только он встретит строку со значением, отличным от 'PROB', он также отобразит этот абзац. Я хочу иметь возможность проверить наличие внутри группы (несколько строк) поля A.OFFER_COMPONENT ='PROB'. Если одна из строк для этого поля содержит «PROB», тогда я НЕ хочу, чтобы отображался второй абзац.

Я посмотрел в Интернете и не нашел способа проверить существование значения поля в нескольких строках, поэтому, если кто-нибудь знает способ сделать это, я был бы признателен. Заранее спасибо!

введите здесь описание изображения


person Nick    schedule 28.01.2020    source источник
comment
Любые мысли по этому поводу приветствуются. Я думаю, что должен быть способ оценить элемент по нескольким строкам...   -  person Nick    schedule 28.01.2020


Ответы (2)


Таким образом, вы можете проверить, нужно ли печатать первый абзац. Ницца. Теперь, сразу после того, как вы напечатаете этот первый абзац, вы можете установить глобальную переменную в значение true. Проверьте xdoxslt:set_variable. Теперь вам нужно только напечатать второй абзац, если значение этой глобальной переменной равно false.

person Ranjith R    schedule 29.01.2020
comment
это интересная идея! Каков будет синтаксис для установки переменной и последующей проверки ее? - person Nick; 29.01.2020
comment
Найдите функцию xdoxslt:set_variable. - person Ranjith R; 30.01.2020

Во-первых, для выбора абзаца используйте <?if@inlines:A.OFFER_COMPONENT='PROB'?> для первого абзаца и <?if@inlines:A.OFFER_COMPONENT<>'PROB'?> для второго абзаца. Обязательно заканчивайте каждое условие if с помощью end-if

Во-вторых, я вижу, что вы используете много операторов for-each для разделов, которые не будут или не должны содержать несколько строк. Например, у вас есть это:

...только будет $за каждый0,00конец в час,...

for-each для нескольких записей. Вы уже находитесь на уровне row, поэтому нет необходимости снова переходить на уровень row с for-each. В противном случае, если вам нужно перейти по XML-пути, просто используйте row/A.OFFER_AMT.

for-each следует использовать для чего-то вроде строк счета-фактуры или упаковочного листа, где вы хотите отображать одно и то же несколько раз, например, для всех элементов в счете-фактуре или упаковочном листе.

person EdHayes3    schedule 29.01.2020