XSLT - 从另一个上下文创建节点

时间:2016-05-24 09:00:58

标签: xml xslt

我有以下XML文件:

<config>
    <files>
        <file uuid="uuid-file1">
            <name>File1</name>
        </file>
        <file uuid="uuid-file2">
            <name>File2</name>
        </file>
        <file uuid="uuid-file3">
            <name>File3</name>
        </file>
        <file uuid="uuid-file4">
            <name>File3</name>
        </file>
    </files>
    <folders>
        <folder uuid="root" />
        <folder uuid="folder1">
            <member ref="uuid-file1" />
        </folder>
        <folder uuid="folder2">
            <member ref="uuid-file2" />
        </folder>
    </folders>
</config>

ie = file1被引用到folder1中,file2被引用到folder2中。 file3和file4不在文件夹中。

我的问题:

我会创建一个XSLT转换来浏览所有&#34;文件&#34;并在文件夹&#34; root&#34;中创建一个引用对于未在文件夹中引用的人。

示例(file3和file4不在文件夹中):

<config>
    <files>
        <file uuid="uuid-file1">
            <name>File1</name>
        </file>
        <file uuid="uuid-file2">
            <name>File2</name>
        </file>
        <file uuid="uuid-file3">
            <name>File3</name>
        </file>
        <file uuid="uuid-file4">
            <name>File4</name>
        </file>
    </files>
    <folders>
        <folder uuid="root" >
            <member ref="uuid-file3" />
            <member ref="uuid-file4" />
        </folder>
        <folder uuid="folder1">
            <member ref="uuid-file1" />
        </folder>
        <folder uuid="folder2">
            <member ref="uuid-file2" />
        </folder>
    </folders>
</config>

我尝试用&#39; for-each&#39;循环,但我不知道如何在文件夹“root”中创建一个新节点。当我浏览&#34;文件&#34;节点...

我需要你的帮助: - )

此致 Zido

1 个答案:

答案 0 :(得分:0)

以这种方式尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="folder" match="folder" use="member/@ref" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="folder[@uuid='root']">
    <xsl:copy>
        <xsl:for-each select="/config/files/file[not(key('folder', @uuid))]">
            <member ref="{@uuid}"/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

请注意,这假设我们知道如何识别“root”文件夹(在此示例中,其@uuid值实际上是字符串“root”)。这部分问题不太清楚。