【问题标题】:XSLT 2.0 change to 1.0XSLT 2.0 更改为 1.0
【发布时间】:2013-06-29 21:32:32
【问题描述】:

我有一个 XSL 文件,它是为与 XSLT 2.0 转换器一起使用而编写的,但现在我需要更改文件以使其与 XSLT 1.0 一起使用。我知道for-each-group-command 是 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>

提前致谢!

【问题讨论】:

  • 除了for-each-group 及其对应的current-group() 之外,您提供的sn-p 似乎没有任何仅2.0 的功能。
  • 那么我将如何更改for-each-group 以使其正常工作?
  • 中间使用 key() 表示您拥有的是 XSLT 1.0 技术(Muenchian 排序方法)和 XSLT 2.0(for-each-group)的混合。这使得转换不那么简单,因为不清楚 key() 的意图。当我需要进行嵌套分组时,我使用基于变量的分组方法(Google:XSLT 基于变量的分组方法)。

标签: xslt xslt-1.0 xslt-2.0


【解决方案1】:

如果您想在 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])]">

如果您有进一步的嵌套分组,您需要更多具有串联键值的键。

【讨论】:

  • 感谢您再次帮助我 :-)
猜你喜欢
  • 2016-12-31
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2016-06-21
  • 2019-07-29
  • 1970-01-01
相关资源
最近更新 更多