XSL根据3个不同的参数选择和分组不同的数据

时间:2014-11-16 12:05:13

标签: xml xslt xpath oracle11g

我正在使用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>

我们将非常感谢您的帮助。我非常感谢你们。

1 个答案:

答案 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分组”时它首先出现),但它确实需要一段时间来解决它。所以,重新阅读,如果可以的话!尝试使用更简单的例子(即在一个元素上组合)。