我需要做的是创建一个具有变量名称列的表(称为x)。我遇到的问题是任何可以变成td的字段都可以是“单行项目”,也就是有一个等于x的colspan。问题是以一种与XML所需的井格式规则一致的方式开始和结束行很难。
以下是数据的样子:
<status>
<section title="">
<columns>3</columns>
<fields>
<field label="Label 1">test data 1</field>
<field label="Label 2">test data 2</field>
<field label="Label 3">test data 3</field>
<field singleRow="true" label="Label 4">test data 4</field>
<field label="Label 5">test data 5</field>
<field label="Label 6">test data 6</field>
<field label="Label 7">test data 7</field>
<field label="Label 8">test data 8</field>
<field label="Label 9">test data 9</field>
<field singleRow="true" label="Label 10">test data 10</field>
<field label="Label 11">test data 11</field>
<field label="Label 12">test data 12</field>
<field label="Label 13">test data 13</field>
<field label="Label 14">test data 14</field>
</fields>
</section>
输出应如下:
<table>
<tr>
<td>Label 1</td>
<td>test data 1</td>
<td>Label 2</td>
<td>test data 2</td>
<td>Label 3</td>
<td>test data 3</td>
</tr>
<tr>
<td>Label 4</td>
<td colspan='5'>test data 4</td>
</tr>
<tr>
<td>Label 5</td>
<td>test data 5</td>
<td>Label 6</td>
<td>test data 6</td>
<td>Label 7</td>
<td>test data 7</td>
</tr>
<tr>
<td>Label 8</td>
<td>test data 8</td>
<td>Label 9</td>
<td colspan='3'>test data 9</td>
</tr>
<tr>
<td>Label 10</td>
<td colspan='5'>test data 10</td>
</tr>
<tr>
<td>Label 11</td>
<td>test data 11</td>
<td>Label 12</td>
<td>test data 12</td>
<td>Label 13</td>
<td>test data 13</td>
</tr>
<tr>
<td>Label 14</td>
<td colspan='5'>test data 14</td>
</tr>
</table>
有没有办法以这样的方式对元素进行分组,以便能够为每个组输出每一行?我和分组一起乱逛,但我还没有找到一个好方法。规则是将所有节点从当前点分组到count = x(在上面的示例中为3)或直到元素具有singleRow属性。
您认为这个问题的优雅解决方案是什么?
答案 0 :(得分:0)
嗯,误读了你的要求,这几乎可以做你想要的......我现在需要出去,希望它有所帮助,稍后会尝试回来修复它:)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="field">
<td><xsl:value-of select="@label" /></td>
<td><xsl:value-of select="text()" /></td>
</xsl:template>
<xsl:template match="fields">
<tbody>
<xsl:for-each-group group-adjacent="exists(@singleRow)" select="*">
<xsl:choose>
<xsl:when test="current-grouping-key() = true()">
<tr>
<xsl:apply-templates select="current-group()" />
</tr>
</xsl:when>
<xsl:otherwise>
<xsl:for-each-group select="current-group()" group-adjacent="position() lt 4">
<tr>
<xsl:apply-templates select="current-group()" />
</tr>
</xsl:for-each-group>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</tbody>
</xsl:template>
<xsl:template match="section">
<xsl:variable name="max" select="number(columns) + 1" />
<xsl:variable name="colspan" select="columns" />
<table>
<caption><xsl:value-of select="@title" /></caption>
<tbody>
<xsl:for-each-group group-adjacent="exists(@singleRow)" select="fields/*">
<xsl:choose>
<xsl:when test="current-grouping-key() = true()">
<tr colspan="{$colspan}">
<xsl:apply-templates select="current-group()" />
</tr>
</xsl:when>
<xsl:otherwise>
<xsl:for-each-group select="current-group()" group-adjacent="position() lt $max">
<tr>
<xsl:apply-templates select="current-group()" />
</tr>
</xsl:for-each-group>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>