好的,这就是我想要完成的事情。我有一个XML文档,它来自目录路径和安全组的CSV文件。我想从具有匹配Path元素的节点中获取Group元素及其子元素,并将其复制到上一个节点。这是一个例子:
<root>
<Folder>
<Path>\\path\to\folder\_Shared Data\</Path>
<Group>
<Account>Shared_Data_RW</Account>
<FullName></FullName>
<AccountType>GROUP</AccountType>
<Permission>Modify</Permission>
</Group>
</Folder>
<Folder>
<Path>\\path\to\folder\_Shared Data\</Path>
<Group>
<Account>Shared_Data_RO</Account>
<FullName></FullName>
<AccountType>GROUP</AccountType>
<Permission>Read & Execute</Permission>
</Group>
</Folder>
</root>
好的,这就是现在的样子。注意两个节点上的Path元素是如何相同的。我想要的是它看起来像这样:
<root>
<Folder>
<Path>\\path\to\folder\_Shared Data\</Path>
<Group>
<Account>Shared_Data_RW</Account>
<FullName></FullName>
<AccountType>GROUP</AccountType>
<Permission>Modify</Permission>
</Group>
<Group>
<Account>Shared_Data_RO</Account>
<FullName></FullName>
<AccountType>GROUP</AccountType>
<Permission>Read & Execute</Permission>
</Group>
</Folder>
</root>
第二个节点消失了,Group元素及其子元素已添加到上一个节点。
我对这种东西还很陌生,我对一般的编程和脚本很满意,但不确定实现这一目标的最佳方法。我已经看到XSLT可能会做我正在寻找的东西,但我想要它实际做的是获取输入XML文件,进行更改,然后给我一个输出XML文件,以便我可以接受它并使用jsTree将其显示在树中的网页上。我也看过Python的ElementTree来处理XML,但我不太清楚从哪里开始获取我正在寻找的结果。
答案 0 :(得分:1)
此转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kFolderByPath" match="Folder" use="Path"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select=
"Folder[generate-id()=generate-id(key('kFolderByPath',Path)[1])]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Folder">
<Folder>
<xsl:copy-of select=
"Path | key('kFolderByPath',Path)/*[not(self::Path)]"/>
</Folder>
</xsl:template>
</xsl:stylesheet>
应用于(已更正的格式良好)提供的XML文档:
<root>
<Folder>
<Path>\\path\to\folder\_Shared Data\</Path>
<Group>
<Account>Shared_Data_RW</Account>
<FullName></FullName>
<AccountType>GROUP</AccountType>
<Permission>Modify</Permission>
</Group>
</Folder>
<Folder>
<Path>\\path\to\folder\_Shared Data\</Path>
<Group>
<Account>Shared_Data_RO</Account>
<FullName></FullName>
<AccountType>GROUP</AccountType>
<Permission>Read & Execute</Permission>
</Group>
</Folder>
</root>
会产生想要的正确结果:
<root>
<Folder>
<Path>\\path\to\folder\_Shared Data\</Path>
<Group>
<Account>Shared_Data_RW</Account>
<FullName/>
<AccountType>GROUP</AccountType>
<Permission>Modify</Permission>
</Group>
<Group>
<Account>Shared_Data_RO</Account>
<FullName/>
<AccountType>GROUP</AccountType>
<Permission>Read & Execute</Permission>
</Group>
</Folder>
</root>
<强>解释强>: