这是我的 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 声明的空输出文件。有没有办法在找不到匹配项时阻止创建文件?或者我的方法中遗漏了一些东西?任何指导将不胜感激!
我在这里遗漏了什么信息吗?
我可以看到像这样的文档
<ns1:FileDesc/>
将满足模板中与when
匹配的/
子句,但是根元素将不匹配任何模板,除了XML声明之外什么也不输出。
我怀疑您试图使用与
/
匹配的模板实现的目标是,如果其他模板都不与根元素匹配,则返回 <empty></empty>
。如果我理解正确,那么我认为您应该删除与 /
匹配的模板并将其替换为:
<xsl:template match="/*">
<empty><!-- fallback --></empty>
</xsl:template>
如果您的特定模板之一与根元素匹配,则上述模板将被忽略,但如果没有一个特定模板与根元素匹配,则上述模板将匹配它。非常通用的
match="/*"
属性自动赋予它比任何与其他可能的根元素与更具体的 match
表达式相匹配的模板更低的优先级。