没有关系的分组

  • 本文关键字:没有关系 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>

在花了几分钟时间重新格式化样本输入和输出并使用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元素。此时,我们希望递归停止,因此transactionitems模式模板不执行任何操作。(它不需要处理事务,因为事务的默认模式模板会处理事务。)

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

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

相关内容

  • 没有找到相关文章

最新更新