1

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

1 回答 1

0

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

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

首先,模板items为它的事务子级调用 apply-templates (因为它们是唯一的输出应该作为输出元素的子级出现的):items

<xsl:template match="items">
  <items>
    <xsl:apply-templates select="transaction"/>
  </items>
</xsl:template>

在默认模式下,模板transaction首先为其子级调用 apply-templates。(这会处理元素。)然后它以特殊模式(这里称为)header调用其直接右兄弟(将成为输出item中元素的第一个子元素)的 apply-templates 。transactionitems

<xsl:template match="transaction">
  <transaction>
    <xsl:apply-templates/>
    <xsl:apply-templates 
        mode="items" 
        select="following-sibling::*[1]"/>
  </transaction>
</xsl:template>

items模式专门用于收集给定事务的项目。它利用了这样一个事实,即所有项目都是兄弟姐妹,都被逐字复制到输出中,并且项目序列在transaction找到下一个兄弟姐妹时结束。

因此,模式中的模板做itemitems两件事:首先它复制自己,然后将仍然处于items模式中的模板应用到它的直接右兄弟。如果那是另一个项目,我们最终将再次评估此模板。然后再次。等等。(如果您有非常多的项目并且 XSLT 优化器很弱,则对堆栈内存的需求可能会攀升。)

<xsl:template match="item" mode="items">
  <xsl:copy-of select="."/>
  <xsl:apply-templates 
      mode="items" 
      select="following-sibling::*[1]"/>
</xsl:template>

最终,一个元素的直接右兄弟item将成为一个transaction元素。此时,我们希望递归停止,因此items-mode 模板transaction什么也不做。(它不需要处理事务,因为事务的默认模式模板会这样做。)

<xsl:template match="transaction" mode="items"/>

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

于 2012-10-17T02:10:38.560 回答