我正在尝试检查上述任何文件夹中是否存在文件,如果没有,请将该文件名写入输出:
所以我的文件夹结构如下所示:
FOLDER_A
a.xml
b.xml
c.xml
d.xml
FOLDER_B
c.xml
d.xml
e.xml
FOLDER_C
d.xml
e.xml
f.xml
g.xml
FOLDER_D
e.xml
f.xml
g.xml
期望的输出:
<files>
<file>a.xml</file>
<file>b.xml</file>
<file>c.xml</file>
<file>d.xml</file>
<file>e.xml</file>
<file>f.xml</file>
<file>g.xml</file>
</files>
到目前为止我的尝试:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" standalone="yes"/>
<xsl:template match="/">
<files>
<xsl:apply-templates/>
</files>
</xsl:template>
<xsl:template match="folders">
<xsl:for-each select="folder">
<xsl:variable name="numberOfFolders" select="count(preceding-sibling::folder)"/>
<xsl:variable name="nameOfPrecedingFolder" select="preceding-sibling::folder/@name"/>
<xsl:variable name="string" select="iri-to-uri(concat(@name, '/?select=*.xml'))"/>
<xsl:variable name="input" select="collection($string)"/>
<xsl:for-each select="$input">
<xsl:choose>
<xsl:when test="$numberOfFolders = 0">
<file>
<xsl:value-of select="tokenize(document-uri(.), '/')[last()]"/>
</file>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="currInput" select="tokenize(document-uri(.), '/')[last()]"/>
<xsl:variable name="currFolder" select="tokenize(document-uri(.), '/')[last()-1]"/>
<xsl:for-each select="$nameOfPrecedingFolder">
<xsl:choose>
<xsl:when test="doc-available(iri-to-uri(concat(.,'/',$currInput))) = fn:false()"></xsl:when>
<xsl:otherwise><file><xsl:value-of select="$currInput"/></file></xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我遇到的问题是我不知道如何编写OR条件。现在,它会单独检查每个文件夹,如果该文件夹中不存在该文件,则将其写入输出,无论它是否已存在于另一个先前文件夹中。
如果这些文件存在于任何一个文件夹中,我怎样才能让它考虑所有以前的文件夹而不将文件写入输出?
帮助和提示非常赞赏!!