【问题标题】:XSL to select and group distinct data based on 3 different parametersXSL 根据 3 个不同的参数选择和分组不同的数据
【发布时间】:2015-01-13 10:08:10
【问题描述】:

我正在使用 XSL 1.0 和 Xpath 1.0。

我是 XSL 和 XPath 的新手,我正在尝试使用 Oracle JDeveloper 在 XSL 中做这件事。我正在根据“名字(强制)、姓氏(可以为空)和 emp_type(可以为空)”这三件事的组合从表中选择数据。我用来从表中检索数据的查询为提供的“名字、姓氏(可以为 null)和 emp_type(可以为 null)”和名字“Nina”选择数据。 “Nina”在表中没有姓氏,因为默认情况下需要检索它,但是它可能有也可能没有“emp_type” 我想要的是将数据分组到不同的块中,其中包含一个特定组合的数据名字、姓氏和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>

如果单个转换无法实现所有这些,请帮助我找出“名字、姓氏和 emp_type”的不同组合,以便我可以在另一个转换中使用它来获得所需的结果。

所需的中间响应:

<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>

您的帮助将不胜感激。我会非常感谢你们。

【问题讨论】:

  • 不需要中间步骤。方法如下:jenitennison.com/xslt/grouping/muenchian.html
  • 我无法理解。请帮帮我,我已经读过了。如果您能让我明白这一点,我将非常感谢您。请提供一些链接,以便我可以在所有 XML 内容(如 xsl、xpath 等)方面做得更好。您能否告诉我如何使用 Muenchian 方法做到这一点。我会很感激的。
  • "我无法理解。" 太糟糕了。我自己不知道如何更好地解释它。尝试在 SO 上查看 Muenchian 分组实现的众多示例。
  • 非常感谢。实际上我正在努力学习,但这对我来说很紧急,所以我把它放在这里。

标签: xml xslt xpath oracle11g


【解决方案1】:

您说您想按名字、姓氏和 emp_type 进行分组。在这种情况下,您需要使用连接键来包含所有三个字段

<xsl:key name="group" match="Output" use="concat(forename, '|', surname, '|', emp_type)" />

请注意此处| 字符的使用。你可以使用任何东西,只要它不出现在三个元素中的任何一个中。

然后,要获取“不同”元素,您必须获取“组”中首先出现的元素,因为它是名字、姓氏和 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 的权威文章(当您在 Google 上搜索“Muenchian grouping”时,它首先出现),但您确实需要一段时间才能理解它。所以,如果可以的话,重新阅读它!并尝试使用更简单的示例(即在一个元素上分组)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2022-01-13
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多