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>
答案 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
右兄弟递归模式值得学习;它使这样的分组任务变得简单。