分组没有关系

时间:2012-10-15 20:09:29

标签: xslt-1.0

XML:

<items>
    <transaction>
        <header>
            <col1>H</col1>
            <col2>XXXX</col2>
            <col3>YYY12345</col3>
            <col4/>
            <col5>YYY12345A1234</col5>
        </header>
    </transaction>
    <item>
        <col1>D</col1>
        <col2>1</col2>
        <col3>5358478</col3>
        <col4>-1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>2</col2>
        <col3>9477498</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>2</col2>
        <col3>9477498</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <transaction>
        <header>
            <col1>H</col1>
            <col2>XXXX</col2>
            <col3>YYY12345</col3>
            <col4/>
            <col5>YYY12345A1236</col5>
        </header>
    </transaction>
    <item>
        <col1>D</col1>
        <col2>1</col2>
        <col3>1676600</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>2</col2>
        <col3>5602891</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>3</col2>
        <col3>7990401</col3>
        <col4>2.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>4</col2>
        <col3>6985683</col3>
        <col4>1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>5</col2>
        <col3>9477498</col3>
        <col4>-1.0000</col4>
        <col5>CA</col5>
    </item>
    <item>
        <col1>D</col1>
        <col2>5</col2>
        <col3>9477498</col3>
        <col4>-1.0000</col4>
        <col5>CA</col5>
    </item>
</items>

期望的输出:

<items>
    <transaction>
        <header>
            <col1>H</col1>
            <col2>XXXX</col2>
            <col3>YYY12345</col3>
            <col4/>
            <col5>YYY12345A1234</col5>
        </header>
        <item>
            <col1>D</col1>
            <col2>1</col2>
            <col3>5358478</col3>
            <col4>-1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>2</col2>
            <col3>9477498</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>2</col2>
            <col3>9477498</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
    </transaction>
    <transaction>
        <header>
            <col1>H</col1>
            <col2>XXXX</col2>
            <col3>YYY12345</col3>
            <col4/>
            <col5>YYY12345A1236</col5>
        </header>
        <item>
            <col1>D</col1>
            <col2>1</col2>
            <col3>1676600</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>2</col2>
            <col3>5602891</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>3</col2>
            <col3>7990401</col3>
            <col4>2.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>4</col2>
            <col3>6985683</col3>
            <col4>1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>5</col2>
            <col3>9477498</col3>
            <col4>-1.0000</col4>
            <col5>CA</col5>
        </item>
        <item>
            <col1>D</col1>
            <col2>5</col2>
            <col3>9477498</col3>
            <col4>-1.0000</col4>
            <col5>CA</col5>
        </item>
    </transaction>
</items>

我正在尝试在xslt 1.0中执行此操作。我很难弄清楚如何在事务块中移动这些项元素。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

在花了几分钟重新格式化您的示例输入和输出并使用diff之后,我认为您要做的只是将transaction元素的所有兄弟元素作为新子元素移动到事务元素中。真?

将以下模板添加到样式表会生成一个样式表,用于生成所需的输出。

首先,items的模板仅为其交易子项调用apply-templates (因为它们是唯一一个输出应显示为输出{Child}的子项的人元素):

items

<xsl:template match="items"> <items> <xsl:apply-templates select="transaction"/> </items> </xsl:template> 的模板在默认模式下首先为其子项调用apply-templates。 (这会处理transaction元素。)然后它会在其右边兄弟(它将成为输出中header元素的第一个item子元素)上调用apply-templates,在特殊模式(此处称为transaction)。

items

<xsl:template match="transaction"> <transaction> <xsl:apply-templates/> <xsl:apply-templates mode="items" select="following-sibling::*[1]"/> </transaction> </xsl:template> 模式专门用于收集给定交易的项目。它利用了这些项目都是兄弟姐妹的事实,所有项目都被逐字复制到输出中,并且当找到下一个items兄弟时,项目序列结束。

因此,transaction模式下item的模板会做两件事:首先它会复制自身,然后它会将模板(仍然处于items模式)应用到其直接的右兄弟。如果那是另一个项目,我们将最终再次评估此模板。然后再次。等等。 (如果你有非常多的项目和弱的XSLT优化器,堆栈内存的要求可能会上升。)

items

最终,<xsl:template match="item" mode="items"> <xsl:copy-of select="."/> <xsl:apply-templates mode="items" select="following-sibling::*[1]"/> </xsl:template> 元素的直接兄弟将成为item元素。此时,我们希望递归停止,因此transaction的{​​{1}}模式模板不执行任何操作。 (它不需要处理事务,因为事务的默认模式模板会这样做。)

items

右兄弟递归模式值得学习;它使这样的分组任务变得简单。