使用xslt检查不同文件夹中是否存在xml文件

时间:2015-02-27 16:18:39

标签: xml xslt

我正在尝试检查上述任何文件夹中是否存在文件,如果没有,请将该文件名写入输出:

所以我的文件夹结构如下所示:

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条件。现在,它会单独检查每个文件夹,如果该文件夹中不存在该文件,则将其写入输出,无论它是否已存在于另一个先前文件夹中。

如果这些文件存在于任何一个文件夹中,我怎样才能让它考虑所有以前的文件夹而不将文件写入输出?

帮助和提示非常赞赏!!

0 个答案:

没有答案