1
我想比較以下兩個XML部分並生成第三個XML部分。XSL比較和合並兩個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節應該包含所有具有相同的名稱作爲與Unix-file
和Directory
元件在第一個XML節中有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。即文件夾中的文件不匹配時,也應該省略文件夾。
非常好。完全符合我的要求。 – user1793318