XSLT генерирует вывод только когда строки не совпадают

Вопрос или проблема

Вот фрагмент моего кода XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:ns1="http://www.oracle.com/retail/integration/base/bo/FileDesc/v1"
   xmlns:ns2="http://www.oracle.com/retail/integration/base/bo/FileRef/v1"
   exclude-result-prefixes="ns1 ns2">

   <xsl:import href="File_Download_Functions.xsl"/>
   <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/>
   <xsl:param name="File_Properties"/>

   <!-- Шаблон на корневом уровне, который управляет выводом на основе совпадений -->
   <xsl:template match="/">
      <xsl:choose>
         <!-- Проверка, есть ли совпадение для FileDesc или FileRef -->
         <xsl:when test="/ns1:FileDesc or /ns2:FileRef">
            <!-- Применять шаблоны только в случае совпадения -->
            <xsl:apply-templates/>
         </xsl:when>
         <xsl:otherwise>
            <!-- Нет совпадений, выводим минимальный корневой элемент -->
            <empty></empty>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>

   <!-- Шаблон для ns1:FileDesc -->
   <xsl:template match="/ns1:FileDesc">
      <xsl:if test="contains(ns1:event_description, '-FLAG-N-FLAG-') and ($File_RType='FileCre' or $File_RType='FileHdrMod' or $File_RType='FileDtlMod' or $File_RType='FileDtlCre')">
         <!-- Логика для ns1:FileDesc -->
         ...
      </xsl:if>
   </xsl:template>

   <!-- Шаблон для ns2:FileRef -->
   <xsl:template match="/ns2:FileRef">
      <xsl:if test="($File_RType) = 'FileDel'">
         <!-- Логика для ns2:FileRef -->
         ...
      </xsl:if>
   </xsl:template>

   <!-- Другие шаблоны -->
   <xsl:template name="get_arnotts_location">
      <!-- Логика для get_arnotts_location -->
   </xsl:template>

   <xsl:template name="splitStringToLocs">
      <!-- Логика для splitStringToLocs -->
   </xsl:template>

</xsl:stylesheet>

Проблема:
Преобразование работает нормально, когда есть подходящий шаблон. Однако, когда ни один из шаблонов не соответствует, все равно создается XML-файл, который содержит только декларацию XML:

попытался добавить блок с условиями с корневым 'шаблоном, который управляет выводом на основе совпадений'

Несмотря на это, пустой выходной файл все равно создается с только лишь декларацией XML. Есть ли способ предотвратить создание файла, когда совпадений не найдено? Или я что-то упустил в своем подходе? Любая помощь будет очень признательна!

Я упустил какую-либо информацию здесь?

Ответ или решение

Проблема: Генерация XSLT только при отсутствии совпадений строк

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

Текущая структура XSLT

Ваша XSLT-программа содержит корневой шаблон, который проверяет наличие элементов ns1:FileDesc или ns2:FileRef. Если такие элементы имеются, вы применяете соответствующие шаблоны, иначе создаете элемент <empty>.

Возможные пути решения проблемы

  1. Проверка наличия товаров в корневом шаблоне:
    Текущий подход выводит недопустимый файл, даже когда нет совпадений. Для того чтобы предотвратить создание файла, без наличия данных, вы можете структурировать свой код так, чтобы он не создавал файл в случае отсутствия подходящих данных.

  2. Использование xsl:template для пустого результата:
    Измените корневой шаблон, чтобы он возвращал никакого вывода в случае отсутствия совпадений. Это необходимо сделать осознанно, чтобы избежать создания XML-декларации.

Вот измененный код шаблона, который не генерирует пустого XML-документа:

<xsl:template match="/">
   <xsl:choose>
      <xsl:when test="/ns1:FileDesc or /ns2:FileRef">
         <xsl:apply-templates/>
      </xsl:when>
      <xsl:otherwise>
         <xsl:result-document href="output.xml" method="xml" indent="yes" version="1.0" encoding="UTF-8">
            <xsl:text> </xsl:text> <!-- Пустое содержимое -->
         </xsl:result-document>
      </xsl:otherwise>
   </xsl:choose>
</xsl:template>

Однако этот вариант может генерировать файл только с пробелом, если в дальнейшем использовать xsl:result-document. Вам нужно будет убедиться, что такая функция отключена или переписать логику так, чтобы при отсутствии соответствия вообще ничего не записывалось.

  1. Проверка параметров на уровне передачи:
    Обратите внимание на параметры, такие как $File_RType. Если они передаются пустыми, или значения не совпадают с проверяемыми, это также может быть причиной, по которой шаблоны не срабатывают. Убедитесь, что данные передаются корректно.

Заключение

Ваш подход в целом корректен, однако вы сталкиваетесь с проблемой, связанной с тем, что XSLT по умолчанию создает выходной файл (даже пустой), когда ни один шаблон не совпадает. Изменение логики шаблона и явное отсутствие вызова xsl:apply-templates при отсутствии совпадений — это шаги, которые помогут вам избежать генерации нежелательных выходных файлов.

Следуйте этим рекомендациям, чтобы улучшить ваш код XSLT и устранить данную проблему. Надеюсь, эта информация будет полезной для вас и поможет в эффективном решении ваших задач.

Оцените материал
Добавить комментарий

Капча загружается...