我一直在编辑,看着这么久,我没有找到一个看似简单的解决方案。处理动态创建的孩子和兄弟姐妹的子女
一个元素(及其兄弟)将有任意数量的不同(动态)结果,我希望在HTML表格中显示每个cd文件对的一行。最初我认为我可以避免每个循环(似乎无论如何都会返回相同的结果),但我需要一种[更好的]方式来引用孩子。下面的来源与我工作的结构类似。
例如,某些“cd”和“文件”将包含更多元素,例如价格,有些可能没有信息。
XML
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.test2.xsl"?>
<catalog>
<rock>
<album>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
</cd>
<file>
<store>Apple</store>
<size>3823</size>
</file>
</album>
<album>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
</cd>
<file>
<store>Amazon</store>
<size>2123</size>
</file>
</album>
</rock>
</catalog>
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#cccccc">
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
<th style="text-align:left">Store</th>
<th style="text-align:left">Size</th>
</tr>
<xsl:apply-templates/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="album">
<tr>
<xsl:apply-templates select="cd"/>
<xsl:apply-templates select="file"/>
</tr>
</xsl:template>
<xsl:template match="cd">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
<xsl:template match="file">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
</xsl:stylesheet>
结果
<table border="1">
<tbody>
<tr bgcolor="#cccccc">
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
<th style="text-align:left">Store</th>
<th style="text-align:left">Size</th>
</tr>
<tr>
<td>
Empire Burlesque
Bob Dylan
</td>
<td>
Apple
3823
</td>
</tr>
<tr>
<td>
Hide your heart
Bonnie Tyler
</td>
<td>
Amazon
2123
</td>
</tr>
</tbody>
</table>
现在,我想我看到发生了什么。根据我的理解,在XSLT文件的“cd”和“文件”模板下,select="."
正在返回<td>
内的所有子项。我需要一种方法让每个人都有一个<td>
。我已经为“cd”和“file”模板中的每个“cd”和“file”以及for-each尝试了诸如call-template之类的东西。请注意,我还需要动态构建<th>
元素,现在它们是为测试目的而手动创建的。有什么建议么?
我们需要一个更好的“动态”定义。例如,你可以说你想为每个叶节点添加一个文本值的列。但是,我没有看到一种方法可以避免硬编码哪些元素会产生一行。 –
我指的是动态而不是静态。 [列数]列将被动态创建,具体取决于API调用返回的内容。将会有0个或更多子元素,在这种情况下,叶子可能包含也可能不包含任何文本,并且可能具有不同的节点名称(顺序不同)(每个节点名称中应包含一列)。 – MasterWill
这是不够的,说什么会改变。您需要告诉我们什么不会 - 以便我们可以使用它来创建输出表的结构。如果没有限制,那么这个任务是不可能的。 –