Вопрос или проблема
Вот фрагмент моего кода 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>
.
Возможные пути решения проблемы
-
Проверка наличия товаров в корневом шаблоне:
Текущий подход выводит недопустимый файл, даже когда нет совпадений. Для того чтобы предотвратить создание файла, без наличия данных, вы можете структурировать свой код так, чтобы он не создавал файл в случае отсутствия подходящих данных. -
Использование
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
. Вам нужно будет убедиться, что такая функция отключена или переписать логику так, чтобы при отсутствии соответствия вообще ничего не записывалось.
- Проверка параметров на уровне передачи:
Обратите внимание на параметры, такие как$File_RType
. Если они передаются пустыми, или значения не совпадают с проверяемыми, это также может быть причиной, по которой шаблоны не срабатывают. Убедитесь, что данные передаются корректно.
Заключение
Ваш подход в целом корректен, однако вы сталкиваетесь с проблемой, связанной с тем, что XSLT по умолчанию создает выходной файл (даже пустой), когда ни один шаблон не совпадает. Изменение логики шаблона и явное отсутствие вызова xsl:apply-templates
при отсутствии совпадений — это шаги, которые помогут вам избежать генерации нежелательных выходных файлов.
Следуйте этим рекомендациям, чтобы улучшить ваш код XSLT и устранить данную проблему. Надеюсь, эта информация будет полезной для вас и поможет в эффективном решении ваших задач.