xslt 2.0: невозможно выбрать несколько значений из xml - PullRequest
0 голосов
/ 02 мая 2019

У меня есть входящие большие сегменты XML 2

1-й сегмент. Необработанные данные как сегмент 2-й сегмент. Данные, которые должны быть переданы, находятся во втором.

Я запускаю цикл для второго и проверяю, существует ли значение FIeld1 во втором сегменте для первого.

Проблема: Есть несколько возвратов из 1-го сегмента против Field1 во 2-м сегменте, но сохраняется как 1 поле, и я не могу разделить их как поля.

Ниже приведен код при запуске с полем 1 во 2-м сегменте против всего 1-го сегмента, который дает 2 результата и сохраняет их как одно значение поля. Я хочу, чтобы они отображались как отдельные поля XML.

Примечание: это работает нормально, когда есть 1 хит.

<xsl:variable name="CheckEmployeeExists">
<xsl:value-of select="../../PerEmail/PerEmail/emailAddress[personIdExternal=$EmpNumber]" />
</xsl:variable>

Пример того, как это сгенерированное значение выглядит для нескольких значений

<Personidexternal xmlns:xs="http://www.w3.org/2001/XMLSchema">801035 801035</Personidexternal>

То, что я хочу, похоже на это

<Personidexternal>801035</Personidexternal>
<Personidexternal>801035</Personidexternal>

Ниже приведен код при запуске с полем 1 во 2-м сегменте против всего 1-го сегмента, который дает 2 результата и сохраняет их как одно значение поля. Я хочу, чтобы они отображались как отдельные поля XML.

Примечание: это работает нормально, когда есть 1 хит.

<xsl:variable name="CheckEmployeeExists">
<xsl:value-of select="../../PerEmail/PerEmail/emailAddress[personIdExternal=$EmpNumber]" />
</xsl:variable>

Пример того, как это сгенерированное значение выглядит для нескольких значений

<Personidexternal xmlns:xs="http://www.w3.org/2001/XMLSchema">801035 801035</Personidexternal>

Что я хочу, хотя это так

<Personidexternal>801035</Personidexternal>
<Personidexternal>801035</Personidexternal>

1 Ответ

0 голосов
/ 02 мая 2019

Эта конструкция немного пахнет кодом:

<xsl:variable name="CheckEmployeeExists">
<xsl:value-of select="../../PerEmail/PerEmail/emailAddress
     [personIdExternal=$EmpNumber]" />
</xsl:variable>

Он создает узел документа с одним текстовым узлом, значением которого является объединение строковых значений узлов, выбранных выражением «select» (что именно то, что вы видите).

Обычно, когда люди пишут это, гораздо лучше написать:

<xsl:variable name="CheckEmployeeExists"
select="../../PerEmail/PerEmail/emailAddress
     [personIdExternal=$EmpNumber]" />

Я не могу сказать, так ли это в вашем случае, потому что мы не видим код, который использует переменную, и выбор имени переменной очень бесполезен.

Не могу сказать вам, как исправить ваш код, не видя больше вашего кода; но вот предположение:

<xsl:copy-of
  select="../../PerEmail/PerEmail/emailAddress/personIdExternal[.=$EmpNumber]">

Имейте в виду:

(а) объявление типа переменной всегда является хорошей идеей в XSLT 2.0: она устанавливает, что автор, читатель и компилятор находятся на одном листе гимна.

(b) использование xsl:value-of часто является ошибкой, особенно когда это единственная инструкция внутри xsl:variable или xsl:function

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...