2013-07-02 72 views
0

我有一个XSL文件已被编写为与XSLT 2.0 Transformer一起使用,但现在我需要更改文件以使其与XSLT 1.0协同工作。我知道for-each-group -command是一个XSLT 2.0功能,但其他所有功能呢?我将如何更改我的文件以使其适用于1.0?XSLT 2.0更改为1.0

这里的XSL-文件:

<xsl:template match="ROWSET"> 

    <ROWSET> 
     <xsl:for-each-group select="ROW" group-by="UKID"> 
      <UEBERKUNDE> 
       <NAME><xsl:value-of select="UEBERKUNDE" /></NAME> 
       <xsl:copy-of select="UKID" /> 
       <xsl:for-each-group select="current-group()" group-by="KUNDENNR"> 
        <KUNDE> 
         <xsl:copy-of select="KUNDENNR" /> 
         <xsl:copy-of select="KNAME1" /> 
         <xsl:copy-of select="KNAME2" /> 
         <xsl:copy-of select="KNAME3" /> 
         <xsl:copy-of select="LAND" /> 
         <xsl:copy-of select="PLZ" /> 
         <xsl:copy-of select="ORT" /> 
         <xsl:copy-of select="ADM" /> 
         <xsl:copy-of select="KUNDENKLASSE" /> 
         <xsl:copy-of select="MITARBEITER" /> 
         <xsl:copy-of select="BELEGART" /> 
         <EFAKTURA><xsl:value-of select="normalize-space(EFAKTURA)" /></EFAKTURA> 
         <WEBSTATUS><xsl:value-of select="normalize-space(WEBSTATUS)" /></WEBSTATUS> 
         <ZAHLUNGSBEDINGUNG><xsl:value-of select="normalize-space(ZAHLUNGSBEDINUNG)" /></ZAHLUNGSBEDINGUNG> 

         <xsl:for-each select="current-group()[count(. | key('rowsByMonth', concat(MONAT,'+',JAHR,'+',KUNDENNR))[1]) = 1]"> 
          <ROW> 
           <xsl:copy-of select="JAHR" /> 
           <xsl:copy-of select="MONAT" /> 
           <xsl:copy-of select="HANDLING" /> 
           <xsl:copy-of select="SOLLFRACHT" /> 
           <xsl:for-each select="key('rowsByMonth', concat(MONAT,'+',JAHR,'+',KUNDENNR))"> 
            <WARENGRUPPE> 
             <xsl:copy-of select="HGNAME" /> 
             <xsl:copy-of select="HGID" /> 
             <xsl:copy-of select="DG_BASIS" /> 
             <xsl:copy-of select="EKECHT" /> 
             <xsl:copy-of select="DB_BASIS" /> 
             <xsl:copy-of select="NETTO" /> 
            </WARENGRUPPE> 
           </xsl:for-each> 
          </ROW> 
         </xsl:for-each> 
        </KUNDE> 
       </xsl:for-each-group> 
      </UEBERKUNDE> 
     </xsl:for-each-group> 
    </ROWSET> 
</xsl:template></xsl:stylesheet> 

提前感谢!

+0

您提供的代码除了'for-each-group'及其对应的'current-group()'外,似乎没有任何2.0-only特性。 – JLRishe

+0

那么我如何改变'for-each-group'来保持它的工作? – gasparuff

+0

中间使用key()表示您拥有的是XSLT 1.0技术(Muenchian排序方法)和XSLT 2.0(针对每个组)的混合体。这使得转换不太直接,因为它不清楚key()的意图。当我需要做嵌套分组时,我使用基于变量的分组方法(Google:基于XSLT变量的分组方法)。 –

回答

0

如果您想在XSLT 1.0中进行分组,请参阅http://www.jenitennison.com/xslt/grouping/muenchian.xml,以便为“分组依据”和http://www.biglist.com/lists/xsl-list/archives/200101/msg00070.html进行嵌套分组。

所以

<ROWSET> 
    <xsl:for-each-group select="ROW" group-by="UKID"> 
     <UEBERKUNDE> 
      <NAME><xsl:value-of select="UEBERKUNDE" /></NAME> 
      <xsl:copy-of select="UKID" /> 
      <xsl:for-each-group select="current-group()" group-by="KUNDENNR"> 

大致翻译成两个键

<xsl:key name="by-ukid" match="ROW" use="UKID"/> 

<xsl:key name="by-nr" match="ROW" use="concat(UKID, '|', KUNDENNR)"/> 

<ROWSET> 
    <xsl:for-each select="ROW[generate-id() = generate-id(key('by-ukid',UKID)[1])]"> 
     <UEBERKUNDE> 
      <NAME><xsl:value-of select="UEBERKUNDE" /></NAME> 
      <xsl:copy-of select="UKID" /> 
      <xsl:for-each select="key('by-ukid', UKID)[generate-id() = generate-id(key('by-nr', concat(UKID, '|', KUNDENNR))[1])]"> 

如果你有进一步的嵌套分组,你需要更多的键与连接的键值。

+0

感谢您再次帮助我:-) – gasparuff