0

我需要使用 xslt 转换一些数据。基本上,我需要对每个客户的信息进行分组。之后,应按客户级别显示所有日期和时间值。我必须提到,我不必只显示不同的值。

<XMLLINE>

<Customer>1</Customer>

<Day> Monday </Day>

<Hour> 10:00 <Hour>

 </XMLLine>

<XMLLINE>

<Customer>2</Customer>

<Day> Monday</Day>

<Hour> 12:00 <Hour>

 </XMLLine>

<XMLLINE>

<Customer>1</Customer>

<Day> Tuesday</Day>

<Hour> 12:00 <Hour>

 </XMLLine>

</XMLines>

输出应该看起来像

<Clients>

<Customer>

<Id> 1 </Id>

<Days>

<Day> Monday </Day>

<Hour> 10:00 <Hour>

<Day> Tuesday</Day>

<Hour> 12:00 <Hour>

</Days>

</Customer>

<Customer>

<Id> 2 </Id>

<Days>

<Day> Monday </Day>

<Hour> 12:00 <Hour>

</Days>

</Customer>

</Clients>

非常感谢各位

4

1 回答 1

0

只需使用 Muenchian 分组进行分组,定义一个键,然后使用该key函数查找组中的所有项目:

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="c-by-id" match="XMLLINE" use="Customer"/>

<xsl:template match="XMLines">
  <Clients>
    <xsl:apply-templates select="XMLLINE[generate-id() = generate-id(key('c-by-id', Customer)[1])]"/>
  </Clients>
</xsl:template>

<xsl:template match="XMLLINE">
  <Customer>
    <Id><xsl:value-of select="Customer"/></Id>
    <Days>
      <xsl:copy-of select="key('c-by-id', Customer)/*[self::Day | self::Hour]"/>
    </Days>
  </Customer>
</xsl:template>

</xsl:stylesheet>

变换

<XMLines>
<XMLLINE>

<Customer>1</Customer>

<Day> Monday </Day>

<Hour> 10:00 </Hour>

 </XMLLINE>

<XMLLINE>

<Customer>2</Customer>

<Day> Monday</Day>

<Hour> 12:00 </Hour>

 </XMLLINE>

<XMLLINE>

<Customer>1</Customer>

<Day> Tuesday</Day>

<Hour> 12:00 </Hour>

 </XMLLINE>

</XMLines>

进入

<Clients>
   <Customer>
      <Id>1</Id>
      <Days>
         <Day> Monday </Day>
         <Hour> 10:00 </Hour>
         <Day> Tuesday</Day>
         <Hour> 12:00 </Hour>
      </Days>
   </Customer>
   <Customer>
      <Id>2</Id>
      <Days>
         <Day> Monday</Day>
         <Hour> 12:00 </Hour>
      </Days>
   </Customer>
</Clients>
于 2013-11-24T10:26:46.473 回答