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>
在花了几分钟时间重新格式化样本输入和输出并使用diff之后,我认为您要做的只是将transaction
元素的所有兄弟元素作为新的子元素移动到事务元素中。是吗?
将以下模板添加到样式表中会生成一个样式表,该样式表会生成所需的输出。
首先,items
调用的模板为其事务子级仅应用模板(因为它们是唯一输出应显示为输出items
元素的子级的模板):
<xsl:template match="items">
<items>
<xsl:apply-templates select="transaction"/>
</items>
</xsl:template>
transaction
调用的模板在默认模式下首先为其子级应用模板。(这将处理header
元素。)然后,它在其右上角的同级(将成为输出中transaction
元素的第一个子item
)上以特殊模式(此处称为items
)调用apply templates。
<xsl:template match="transaction">
<transaction>
<xsl:apply-templates/>
<xsl:apply-templates
mode="items"
select="following-sibling::*[1]"/>
</transaction>
</xsl:template>
items
模式专门用于收集给定事务的项目。它利用了这样一个事实,即项都是同级项,所有项都被逐字复制到输出中,并且当找到下一个transaction
同级项时,项序列结束。
因此,items
模式下的item
模板做了两件事:首先它复制自己,然后它将模板(仍处于items
模式)应用于它的右上兄弟。如果这是另一项,我们将再次评估此模板。再说一遍。等等
<xsl:template match="item" mode="items">
<xsl:copy-of select="."/>
<xsl:apply-templates
mode="items"
select="following-sibling::*[1]"/>
</xsl:template>
最终,item
元素的直接右侧同级元素将是transaction
元素。此时,我们希望递归停止,因此transaction
的items
模式模板不执行任何操作。(它不需要处理事务,因为事务的默认模式模板会处理事务。)
<xsl:template match="transaction" mode="items"/>
正确的兄弟递归模式值得学习;它使像这样的任务分组变得简单。