我正在使用XSL 1.0和Xpath 1.0。
我是XSL和XPath的新手,我正在尝试使用Oracle JDeveloper在XSL中做这件事。我正在从表格中选择数据,这些数据是" forename(必填),surname(可以为null)和emp_type(可以为null)"的组合。我用来从表中检索数据的查询选择提供的" forename,surname(可以为null)和emp_type(可以为null)"而且为了#Nina"。 "尼娜"表格中没有姓氏,因为默认情况下需要检索姓氏,但它可能有也可能没有" emp_type"我想要的是将数据分组到不同的块中,其中包含" forename,surname和emp_type"的特定组合的数据。在应用转换后进入结果的一个节点。表格中的数据收集如下图所示:
来自表格的数据:
<OutputCollection>
<Output>
<forename>Anna</forename>
<surname>Collins</surname>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description1</descname>
<desc>Description</desc>
<comment>comment1</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname>Collins</surname>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description2</descname>
<desc>Description</desc>
<comment>comment2</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname>Collins</surname>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description3</descname>
<desc>Description</desc>
<comment>comment3</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description4</descname>
<desc>Description</desc>
<comment>comment4</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description5</descname>
<desc>Description</desc>
<comment>comment5</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description6</descname>
<desc>Description</desc>
<comment>comment6</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description7</descname>
<desc>Description</desc>
<comment>comment7</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description8</descname>
<desc>Description</desc>
<comment>comment8</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description9</descname>
<desc>Description</desc>
<comment>comment9</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname nil="true"/>
<emp_type nil="true"/>
<off_type nil="true"/>
<descname>Description10</descname>
<desc>Description</desc>
<comment>comment10</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname nil="true"/>
<emp_type nil="true"/>
<off_type nil="true"/>
<descname>Description11</descname>
<desc>Description</desc>
<comment>comment11</comment>
</Output>
<Output>
<forename>Anna</forename>
<surname nil="true"/>
<emp_type nil="true"/>
<off_type nil="true"/>
<descname>Description12</descname>
<desc>Description</desc>
<comment>comment12</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description13</descname>
<desc>Description</desc>
<comment>comment13</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description14</descname>
<desc>Description</desc>
<comment>comment14</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description15</descname>
<desc>Description</desc>
<comment>comment15</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description</descname>
<desc>Description16</desc>
<comment>comment16</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description18</descname>
<desc>Description</desc>
<comment>comment18</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description19</descname>
<desc>Description</desc>
<comment>comment19</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description20</descname>
<desc>Description</desc>
<comment>comment20</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description21</descname>
<desc>Description</desc>
<comment>comment21</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<descname>Description22</descname>
<desc>Description</desc>
<comment>comment22</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type nil="true"/>
<off_type nil="true"/>
<descname>Description23</descname>
<desc>Description</desc>
<comment>comment23</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type nil="true"/>
<off_type nil="true"/>
<descname>Description24</descname>
<desc>Description</desc>
<comment>comment24</comment>
</Output>
<Output>
<forename>Nina</forename>
<surname nil="true"/>
<emp_type nil="true"/>
<off_type nil="true"/>
<descname>Description25</descname>
<desc>Description</desc>
<comment>comment25</comment>
</Output>
</OutputCollection>
要求:
<Response_After_Applying_Transformation>
<Outputs>
<Output>
<forename>Anna</forename>
<surname>Collins</surname>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<desc_groups>
<desc_group>
<descname>Description1</descname>
<desc>Description</desc>
<comment>comment1</comment>
</desc_group>
<desc_group>
<descname>Description2</descname>
<desc>Description</desc>
<comment>comment2</comment>
</desc_group>
<desc_group>
<descname>Description3</descname>
<desc>Description</desc>
<comment>comment3</comment>
</desc_group>
</desc_groups>
.
.
.
</Output>
<Output>
<forename>Anna</forename>
<surname/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<desc_groups>
<desc_group>
<descname>Description4</descname>
<desc>Description</desc>
<comment>comment4</comment>
</desc_group>
<desc_group>
<descname>Description5</descname>
<desc>Description</desc>
<comment>comment5</comment>
</desc_group>
<desc_group>
<descname>Description6</descname>
<desc>Description</desc>
<comment>comment6</comment>
</desc_group>
</desc_groups>
.
.
.
</Output>
<Output>
<forename>Anna</forename>
<surname/>
<emp_type/>
<off_type/>
<desc_groups>
<desc_group>
<descname>Description10</descname>
<desc>Description</desc>
<comment>comment10</comment>
</desc_group>
<desc_group>
<descname>Description11</descname>
<desc>Description</desc>
<comment>comment11</comment>
</desc_group>
<desc_group>
<descname>Description12</descname>
<desc>Description</desc>
<comment>comment12</comment>
</desc_group>
</desc_groups>
.
.
.
</Output>
<Output>
<forename>Nina</forename>
<surname/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
<desc_groups>
<desc_group>
<descname>Description13</descname>
<desc>Description</desc>
<comment>comment13</comment>
</desc_group>
<desc_group>
<descname>Description14</descname>
<desc>Description</desc>
<comment>comment14</comment>
</desc_group>
<desc_group>
<descname>Description15</descname>
<desc>Description</desc>
<comment>comment15</comment>
</desc_group>
</desc_groups>
.
.
.
</Output>
<Output>
<forename>Nina</forename>
<surname/>
<emp_type/>
<off_type/>
<desc_groups>
<desc_group>
<descname>Description23</descname>
<desc>Description</desc>
<comment>comment23</comment>
</desc_group>
<desc_group>
<descname>Description24</descname>
<desc>Description</desc>
<comment>comment24</comment>
</desc_group>
<desc_group>
<descname>Description25</descname>
<desc>Description</desc>
<comment>comment25</comment>
</desc_group>
</desc_groups>
.
.
.
</Output>
</Outputs>
</Response_After_Applying_Transformation>
如果单次转换无法做到这一切,请帮助我找到&#34; forename,surname和emp_type&#34;的不同组合。这样我就可以在另一个转换中使用它来获得所需的结果。
必要的中间响应:
<Intermediate_Response>
<Intermediate_Result>
<forename>Anna</forename>
<surname>Collins</surname>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
</Intermediate_Result>
<Intermediate_Result>
<forename>Anna</forename>
<surname/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
</Intermediate_Result>
<Intermediate_Result>
<forename>Anna</forename>
<surname/>
<emp_type/>
<off_type/>
</Intermediate_Result>
<Intermediate_Result>
<forename>Nina</forename>
<surname/>
<emp_type>Permanent</emp_type>
<off_type>PERM</off_type>
</Intermediate_Result>
<Intermediate_Result>
<forename>Nina</forename>
<surname/>
<emp_type/>
<off_type/>
</Intermediate_Result>
</Intermediate_Response>
我们将非常感谢您的帮助。我非常感谢你们。
答案 0 :(得分:2)
你说你想通过forename,surname和emp_type进行分组。在这种情况下,您需要使用连接键来包含所有三个字段
<xsl:key name="group" match="Output" use="concat(forename, '|', surname, '|', emp_type)" />
请注意此处使用|
字符。你可以使用任何东西,只要它不会出现在三个元素中的任何一个中。
然后,要获得'distinct'元素,您必须获得首先出现在'group'中的元素,因为它是forename,surname和emp_type的特定组合。你这样做是这样的:
<xsl:apply-templates select="Output[generate-id() = generate-id(key('group', concat(forename, '|', surname, '|', emp_type))[1])]" />
要获取群组中的所有项目(针对您的desc_group
),您只需再次使用该密钥
<xsl:for-each select="key('group', concat(forename, '|', surname, '|', emp_type))">
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="group" match="Output" use="concat(forename, '|', surname, '|', emp_type)" />
<xsl:template match="Outputs">
<xsl:copy>
<xsl:apply-templates select="Output[generate-id() = generate-id(key('group', concat(forename, '|', surname, '|', emp_type))[1])]" />
</xsl:copy>
</xsl:template>
<xsl:template match="Output">
<xsl:copy>
<xsl:apply-templates select="forename|surname|emp_type|off_type" />
<desc_groups>
<xsl:for-each select="key('group', concat(forename, '|', surname, '|', emp_type))">
<desc_group>
<xsl:apply-templates select="descname|desc|comment" />
</desc_group>
</xsl:for-each>
</desc_groups>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Jeni's XSLT Pages: Grouping Using the Muenchian Method的链接可能是关于Muenchian Grouping的权威文章(当你谷歌“Muenchian分组”时它首先出现),但它确实需要一段时间来解决它。所以,重新阅读,如果可以的话!尝试使用更简单的例子(即在一个元素上组合)。