2

好的,这就是我想要完成的。我有一个来自目录路径和安全组的 CSV 文件的 XML 文档。我想从具有匹配 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 将其显示在树中的网页上。我还查看了用于处理 XML 的 Python 的 ElementTree,但我不太确定从哪里开始以获得我正在寻找的结果。

4

1 回答 1

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 &amp; 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 &amp; Execute</Permission>
      </Group>
   </Folder>
</root>

说明

使用Muenchian 分组方法

于 2013-03-01T03:43:57.133 回答