Нужна помощь в поиске первого непустого элемента в XML с использованием XSLT - PullRequest
1 голос
/ 22 апреля 2019

Элемент XML содержит как пустые, так и непустые значения. Мне нужно захватить первый непустой элемент. Я пробовал циклы for-each с условным оператором when / select или if, но читая другие сообщения. Кажется, это должно быть просто сделать с помощью select = "" в XSL.

For-each с select / if условные операторы всегда возвращают несколько значений, когда я только хочу, чтобы первый непустой элемент и его значение были возвращено / присвоено моей переменной или непосредственно в HTML-коде XSL.

Я также пытался следовать этому примеру для выполнения чего-то подобного: Получить непустой элемент, используя XPATH

но моя переменная всегда возвращает 'empty'.

Вот фрагмент XML, который я обрабатываю с пустыми и непустыми значениями элементов для ifid:

<transaction>

<SurePayDetails>
<Subfield>

<ifid></ifid>

</Subfield>
</SurePayDetails>

<SurePayDetails>
<Subfield>

<ifid></ifid>

</Subfield>
</SurePayDetails>
<SurePayDetails>
<Subfield>

<ifid>0022</ifid>
</Subfield>
</SurePayDetails>

</transaction>

Я попытался получить доступ / присвоить переменной первый непустой элемент, используя следующее:

<xsl:variable name="auth_code" select="/transaction/SurePayDetails/Subfield/ifid[text()[string-length(.) > 0]][1]"/>

который, как я понимаю, выберет первый элемент ifid, длина которого больше 0, а [1] выберет это значение.

Я не уверен, правильно ли я ссылаюсь на XML в приведенном выше select="", потому что, если я перейду к документу со следующим:

`<xsl:for-each select="//ns1:transaction/ns1:SurePayDetails/ns1:Subfield">
.
.
<xsl:variable name="auth_code" select="ns1:ifid"/>`

код auth_code заполняется как пустыми, так и непустыми значениями, как и ожидалось.

Спасибо!

1 Ответ

0 голосов
/ 22 апреля 2019

Вы можете использовать одно из следующих выражений.Из-за приоритета оператора первая часть должна быть заключена в квадратные скобки.

<xsl:variable name="auth_code"  select="(/transaction/SurePayDetails/Subfield/ifid[normalize-space(text())])[1]" />

или короче

<xsl:variable name="auth_code"  select="(//ifid[normalize-space(text())])[1]" />

РЕДАКТИРОВАТЬ: В целом шаблон с добавленными пространствами имен это может выглядетьвот так: выводит первое ns1:ifid значение.

<xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <xsl:value-of select="(/ns1:transaction/ns1:SurePayDetails/ns1:Subfield/ns1:ifid[normalize-space(text())])[1]" />
    </html>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...