我正在尝试比较以下两个 XML 节并生成第三个。
1)
<Drive>
<Folders>
<Folder>
<name>folder1</name>
<Files>
<File>
<State>Writable</State>
<name>file1</name>
</File>
</Files>
</Folder>
</Folders>
<Files>
<File>
<State>Readable</State>
<name>file2</name>
</File>
</Files>
</Drive>
2)
<Partition>
<Directories>
<Directory>
<name>folder1</name>
<Unix-File>
<name>file1</name>
</Unix-File>
</Directory>
<Directory>
<name>folder-5</name>
<Unix-File>
<name>file-5</name>
</Unix-File>
</Directory>
</Directories>
<Unix-Files>
<Unix-File>
<name>file2</name>
</Unix-File>
</UnixFiles>
</Partition>
现在,
1) 生成的 XML 节应包含与第一个 XML 节中的元素同名并具有of 的所有Unix-file
和元素。Directory
State
Writable
2) 应省略任何没有任何匹配文件的匹配文件夹。
3)这里我假设文件结构的深度是2。即文件夹将不再包含文件夹。
所以对于上述场景,结果应该是
<Partition>
<Directories>
<Directory>
<name>folder1</name>
<Unix-File>
<name>file1</name>
</Unix-File>
</Directory>
</Directories>
</Partition>
我正在使用以下 XSL 文件。
<xsl:if test="count(Drive/Folders/Folder) > 0">
<Directories>
<xsl:for-each select="Partition/Directories/Directory">
<xsl:variable name="directoryName" select="name"/>
<xsl:if test="../../../Drive/Folders/Folder[name=$directoryName]">
<Directory>
<name><xsl:value-of select="name"/>
</name>
<Unix-Files>
<xsl:for-each select="Unix-Files/Unix-File">
<xsl:variable name="fileName" select="name"/>
<xsl:if test="../../../../../Drive/Folders/Folder[name=$directoryName]/Files/File[name=$fileName]">
<xsl:if test="../../../../../Drive/Folders/Folder[name=$directoryName]/Files/File[name=$fileName]/State != 'Writable'">
<xsl:value-of select="."/>
</xsl:if>
</xsl:if>
</xsl:for-each>
</Unix-Files>
</Directory>
</xsl:if>
</xsl:for-each>
</Directories>
</xsl:if>
上面的 XSLT 工作正常,除了上面的要求 2。即,当文件夹中的文件不匹配时,它也应该省略该文件夹。