需要将 XML 与文件夹名称分组,然后再分组
Need to group the XML with Folder name and then on sections
<custom>
<section name="A">
<element name="Folder">A11</element>
<element name="Name">Test1</element>
<element name="Result">Fail</element>
</section>
<section name="B">
<element name="Folder">A11</element>
<element name="Name">Test2</element>
<element name="Result">Pass</element>
</section>
<section name="C">
<element name="Folder">A12</element>
<element name="Name">Test3</element>
<element name="Result">Pass</element>
</section>
<section name="D">
<element name="Folder">A13</element>
<element name="Name">Test4</element>
<element name="Result">Pass</element>
</section>
</custom>
<custom>
<section name="A">
<element name="Folder">A12</element>
<element name="Name">Test1</element>
<element name="Result">Pass</element>
</section>
<section name="B">
<element name="Folder">A12</element>
<element name="Name">Test2</element>
<element name="Result">Fail</element>
</section>
<section name="C">
<element name="Folder">A11</element>
<element name="Name">Test3</element>
<element name="Result">Pass</element>
</section>
<section name="D">
<element name="Folder">A13</element>
<element name="Name">Test4</element>
<element name="Result">Pass</element>
</section>
</custom>
按文件夹分组
文件夹下的部分名称
所有元素名称
例如
A11
- 部分名称="A"
- 文件夹、名称、结果值
- 栏目名称="B"
- 文件夹,名称,结果值
A12
- 部分名称="C"
- 文件夹、名称、结果值
A13
- 部分名称="D"
- 文件夹、名称、结果值
--每个自定义都一样---
需要以下格式的结果:
<root>
<custom>
<Folder>A11
<section name>A
<element name="Folder">A11</element>
<element name="Name">Test1</element>
<element name="Result">Fail</element>
</section>
<section name="B">
<element name="Folder">A11</element>
<element name="Name">Test2</element>
<element name="Result">Pass</element>
</section>
</Folder>
<Folder>A12
<section name>C
<element name="Folder">A12</element>
<element name="Name">Test3</element>
<element name="Result">Pass</element>
</section>
</Folder>
<Folder>A13
<section name="D">
<element name="Folder">A13</element>
<element name="Name">Test4</element>
<element name="Result">Pass</element>
</section>
</Folder>
<custom>
<custom>
<Folder>A11
<section name>C
<element name="Folder">A11</element>
<element name="Name">Test3</element>
<element name="Result">Pass</element>
</section>
</Folder>
<Folder>A12
<section name>A
<element name="Folder">A12</element>
<element name="Name">Test1</element>
<element name="Result">Pass</element>
</section>
<section name>B
<element name="Folder">A12</element>
<element name="Name">Test2</element>
<element name="Result">Fail</element>
</section>
</Folder>
<Folder>A13
<section name="D">
element name="Folder">A13</element>
<element name="Name">Test4</element>
<element name="Result">Pass</element>
</section>
</Folder>
<custom>
</root>
您应该首先从 XSLT Identity Template 开始,它从输入文档
复制所有节点
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
但是您可以添加一个模板来匹配 custom
元素,然后可以使用该模板对 section
元素进行分组。在 XSLT 2.0 中,您可以为此使用 xsl:for-each-group
<xsl:for-each-group select="section" group-by="element[@name='Folder']">
在其中,创建一个新的 folder
元素,然后将现有的 section
元素复制到其中相对简单。
<folder name="{current-grouping-key()}">
<xsl:apply-templates select="current-group()" />
</folder>
试试这个 XSLT。请注意,这不会给您您在问题中显示的 XML,因为您显示的 XML 格式不正确(<section name>
无效),但它应该给您总体思路。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="custom">
<xsl:for-each-group select="section" group-by="element[@name='Folder']">
<folder name="{current-grouping-key()}">
<xsl:apply-templates select="current-group()" />
</folder>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="element[@name='Folder']" />
</xsl:stylesheet>
<custom>
<section name="A">
<element name="Folder">A11</element>
<element name="Name">Test1</element>
<element name="Result">Fail</element>
</section>
<section name="B">
<element name="Folder">A11</element>
<element name="Name">Test2</element>
<element name="Result">Pass</element>
</section>
<section name="C">
<element name="Folder">A12</element>
<element name="Name">Test3</element>
<element name="Result">Pass</element>
</section>
<section name="D">
<element name="Folder">A13</element>
<element name="Name">Test4</element>
<element name="Result">Pass</element>
</section>
</custom>
<custom>
<section name="A">
<element name="Folder">A12</element>
<element name="Name">Test1</element>
<element name="Result">Pass</element>
</section>
<section name="B">
<element name="Folder">A12</element>
<element name="Name">Test2</element>
<element name="Result">Fail</element>
</section>
<section name="C">
<element name="Folder">A11</element>
<element name="Name">Test3</element>
<element name="Result">Pass</element>
</section>
<section name="D">
<element name="Folder">A13</element>
<element name="Name">Test4</element>
<element name="Result">Pass</element>
</section>
</custom>
按文件夹分组 文件夹下的部分名称 所有元素名称
例如
A11 - 部分名称="A" - 文件夹、名称、结果值
- 栏目名称="B"
- 文件夹,名称,结果值
A12 - 部分名称="C" - 文件夹、名称、结果值
A13 - 部分名称="D" - 文件夹、名称、结果值
--每个自定义都一样---
需要以下格式的结果:
<root>
<custom>
<Folder>A11
<section name>A
<element name="Folder">A11</element>
<element name="Name">Test1</element>
<element name="Result">Fail</element>
</section>
<section name="B">
<element name="Folder">A11</element>
<element name="Name">Test2</element>
<element name="Result">Pass</element>
</section>
</Folder>
<Folder>A12
<section name>C
<element name="Folder">A12</element>
<element name="Name">Test3</element>
<element name="Result">Pass</element>
</section>
</Folder>
<Folder>A13
<section name="D">
<element name="Folder">A13</element>
<element name="Name">Test4</element>
<element name="Result">Pass</element>
</section>
</Folder>
<custom>
<custom>
<Folder>A11
<section name>C
<element name="Folder">A11</element>
<element name="Name">Test3</element>
<element name="Result">Pass</element>
</section>
</Folder>
<Folder>A12
<section name>A
<element name="Folder">A12</element>
<element name="Name">Test1</element>
<element name="Result">Pass</element>
</section>
<section name>B
<element name="Folder">A12</element>
<element name="Name">Test2</element>
<element name="Result">Fail</element>
</section>
</Folder>
<Folder>A13
<section name="D">
element name="Folder">A13</element>
<element name="Name">Test4</element>
<element name="Result">Pass</element>
</section>
</Folder>
<custom>
</root>
您应该首先从 XSLT Identity Template 开始,它从输入文档
复制所有节点<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
但是您可以添加一个模板来匹配 custom
元素,然后可以使用该模板对 section
元素进行分组。在 XSLT 2.0 中,您可以为此使用 xsl:for-each-group
<xsl:for-each-group select="section" group-by="element[@name='Folder']">
在其中,创建一个新的 folder
元素,然后将现有的 section
元素复制到其中相对简单。
<folder name="{current-grouping-key()}">
<xsl:apply-templates select="current-group()" />
</folder>
试试这个 XSLT。请注意,这不会给您您在问题中显示的 XML,因为您显示的 XML 格式不正确(<section name>
无效),但它应该给您总体思路。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="custom">
<xsl:for-each-group select="section" group-by="element[@name='Folder']">
<folder name="{current-grouping-key()}">
<xsl:apply-templates select="current-group()" />
</folder>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="element[@name='Folder']" />
</xsl:stylesheet>