【发布时间】:2015-07-24 04:48:51
【问题描述】:
您好,过去几天我一直在为此苦苦挣扎,找不到好的答案或解决方案。我有一个包含如下对象列表的 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<LineItems>
<TableName>Lines</TableName>
<TableTerm>Lines</TableTerm>
<LineItems>
<Class>A Class</Class>
</LineItems>
<LineItems>
<Number>1234</Number>
</LineItems>
<LineItems>
<Description>G</Description>
</LineItems>
<LineItems>
<Class>B Class</Class>
</LineItems>
<LineItems>
<Number>5678</Number>
</LineItems>
<LineItems>
<Description>F</Description>
</LineItems>
<ColumnMetadata>
<Name>Class</Name>
<Term>Class</Term>
</ColumnMetadata>
<ColumnMetadata>
<Name>Number</Name>
<Term>No</Term>
</ColumnMetadata>
<ColumnMetadata>
<Name>Description</Name>
<Term>Description</Term>
</ColumnMetadata>
</LineItems>
我正在应用以下转换:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<xsl:variable name="columns" select="count(LineItems/ColumnMetadata)" />
<xsl:variable name="items" select="count(LineItems/LineItems)" />
<xsl:variable name="rows" select="$items div $columns" />
<table border="1">
<thead >
<tr bgcolor="#9acd32">
<xsl:for-each select="LineItems/ColumnMetadata">
<th style="padding: .3em 0;">
<xsl:value-of select="Term" />
</th>
</xsl:for-each>
</tr>
</thead>
<tbody style="text-align: center;">
<xsl:for-each select="(//LineItems)[position()<=$rows]">
<xsl:variable name="i" select="position() - 1"/>
<tr>
<xsl:for-each select="(//*)[position()<=$columns]">
<xsl:variable name="j" select="position()+($columns*$i)"/>
<td style="padding: .3em 0;">
<xsl:value-of select="LineItems/LineItems[$j]" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
这个案例的最终期望输出是:
<table>
<thead>
<tr>
<th>Class</th>
<th>No</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>A Class</td>
<td>1234</td>
<td>G</td>
</tr>
<tr>
<td>B Class</td>
<td>5678</td>
<td>F</td>
</tr>
</tbody>
</table>
这种情况是 MxN 表的情况,我知道节点有多少列。所以,总结一下:
- 必须转换为表格的实际列表都在根
<LineItems>内。 - 我不知道我将获得多少项目(行),但我可以计算它们除以
<LineItems>节点 ($items) 的数量除以<ColumnMetadata>节点 ($columns) 的数量 -
<Class>、<Number>和<Description>等节点是表中的列,但它们可以有其他名称,它们是动态的,可以是 5、6...许多列。
如果我在在线工具中使用 XSL 在 XML 之上进行转换,我只会得到表格的标题行(并且检查 HTML,我可以看到 2 行对应 2 个项目,但为空)。如果我使用 Visual Studio 转换工具,我不仅会获得标题行,还会获得表的前 2 列(在此示例中为类值),但不会获得其余列中的值。我真的不明白发生了什么,为什么我使用不同的工具会得到不同的结果。
提前致谢
【问题讨论】:
-
我有点难以理解您想要实现的目标。您能否添加预期的输出或您已经获得的输出。
-
关于您的输入的最大问题是订单项是否遵循常规模式。在您的示例中,有 3 列和 2 行 - 行项目以从左到右、从上到下的整洁顺序枚举 6 个单元格值(或至少看起来如此)。如果情况总是如此(即一个空单元格将由一个空行项目元素表示),那么这很容易。否则会变得复杂。
-
@LingamurthyCS 我添加了所需的输出。谢谢。
-
@michael.hor257k 一旦创建了 XML,lineitmes 就会遵循常规模式。但我不知道在创建 XML 之前的名称、列数量或项目。