根据条件循环遍历目录中的文件

时间:2014-12-30 13:14:16

标签: xslt xslt-2.0

我的XML如下所示。它名为title.xml

<entry>
<file name="AMR_1A.xml"></file>
<file name="AMR_1B.xml"></file>
<file name="AMR_1C.xml"></file>
<file name="AMR_1D.xml"></file>
<file name="AMR_1E.xml"></file>
<file name="AMR_1F.xml"></file>
<file name="AMR_1G.xml"></file>
<file name="AMR_1H.xml"></file>
<file name="AMR_2A.xml"></file>
<file name="AMR_2B.xml"></file>
<file name="AMR_2C.xml"></file>
<file name="AMR_2D.xml"></file>
<file name="AMR_2E.xml"></file>
<file name="AMR_2F.xml"></file>
<file name="AMR_2G.xml"></file>
</entry>

和放置在此title.xml文件所在的文件夹中的文件。我还有以下文件

idx_1.xml
idx_2.xml

这里我试图做下面的事情。

首先打开idx_X.xml并使用XSLT,我想参考我的title.xml循环遍历文件。条件是the looping should be done only on the files where the number matches the number in filename, i.e. translate all the text in title.xml file and the idx file, and if they match, then it should be looped only through those files,我试过的xslt如下。但它没有用。

<xsl:for-each select="document('C:\Users\u0138039\Desktop\MY\2014All\XML\title.xml')/entry/file[translate(translate(replace(@name,'[^a-zA-Z]', ''),'.xml',''),'_','') = translate(translate(replace(base-uri(),'[^a-zA-Z]', ''),'.xml',''),'_','')]">
                    <xsl:value-of select="translate(normalize-space(replace(base-uri(document(concat('C:\Users\u0138039\Desktop\MY\2014All\XML\',./@name))//case[//star.page=regex-group(1)]), '^.*/', '')),'.xml','')"/>
                </xsl:for-each>

请让我知道如何解决这个问题。

由于

1 个答案:

答案 0 :(得分:1)

下面将为您提供title.xml中使用的唯一编号,并根据需要进行翻译 也许你可以用它来进一步发展。

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">  
        <xsl:for-each-group select="/entry/file" group-by="replace(@name,'(^.*_)([0-9])([a-zA-Z])(.xml$)', 'idx$2$4')">
            <xsl:value-of select="replace(@name,'(^.*_)([0-9])([a-zA-Z])(.xml$)', 'idx$2$4')"/>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

另外看看你是否可以不使用title.xml并使用名称为&#34; idx _ **。xml&#34;的所有文件,见下面的例子。

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:for-each select="collection(iri-to-uri('file:///c:/Temp/XML/?select=idx_[0-9]+.xml'))">
            <xsl:value-of select="entry/file/@name"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>