我有以下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
答案 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”)。这部分问题不太清楚。