XSLT 仅在没有匹配字符串时生成输出

问题描述 投票:0回答:1

这是我的 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"/>

   <!-- Root-level template that controls output based on matches -->
   <xsl:template match="/">
      <xsl:choose>
         <!-- Check if there is any match for FileDesc or FileRef -->
         <xsl:when test="/ns1:FileDesc or /ns2:FileRef">
            <!-- Apply templates only if match is found -->
            <xsl:apply-templates/>
         </xsl:when>
         <xsl:otherwise>
            <!-- No matches, output minimal root element -->
            <empty></empty>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>

   <!-- Template for 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')">
         <!-- Logic for ns1:FileDesc -->
         ...
      </xsl:if>
   </xsl:template>

   <!-- Template for ns2:FileRef -->
   <xsl:template match="/ns2:FileRef">
      <xsl:if test="($File_RType) = 'FileDel'">
         <!-- Logic for ns2:FileRef -->
         ...
      </xsl:if>
   </xsl:template>

   <!-- Other templates -->
   <xsl:template name="get_arnotts_location">
      <!-- Logic for get_arnotts_location -->
   </xsl:template>

   <xsl:template name="splitStringToLocs">
      <!-- Logic for splitStringToLocs -->
   </xsl:template>

</xsl:stylesheet>

问题: 当有匹配的模板时,转换效果很好。但是,当没有任何模板匹配时,仍然会创建一个 XML 文件,其中仅包含 XML 声明:

tried to add the block with conditions with Root-level 'template that controls output based on matches'

尽管如此,仍然会创建一个仅包含 XML 声明的空输出文件。有没有办法在找不到匹配项时阻止创建文件?或者我的方法中遗漏了一些东西?任何指导将不胜感激!

我在这里遗漏了什么信息吗?

xslt xslt-1.0 xslt-2.0 xslt-grouping exslt
1个回答
0
投票

我可以看到像这样的文档

<ns1:FileDesc/>
将满足模板中与
when
匹配的
/
子句,但是根元素将不匹配任何模板,除了XML声明之外什么也不输出。

我怀疑您试图使用与

/
匹配的模板实现的目标是,如果其他模板都不与根元素匹配,则返回
<empty></empty>
。如果我理解正确,那么我认为您应该删除与
/
匹配的模板并将其替换为:

<xsl:template match="/*">
   <empty><!-- fallback --></empty>
</xsl:template>

如果您的特定模板之一与根元素匹配,则上述模板将被忽略,但如果没有一个特定模板与根元素匹配,则上述模板将匹配它。非常通用的

match="/*"
属性自动赋予它比任何与其他可能的根元素与更具体的
match
表达式相匹配的模板更低的优先级。

© www.soinside.com 2019 - 2024. All rights reserved.