快速注意:我受限于XSL 1.0,因此在阅读问题时请记住这一点。
我有一组XML,如下所示:
<TOP_LEVEL>
<ele1 />
<ele2 />
<ele3 />
<ele4 />
<ele5 />
.
.
.
</TOP_LEVEL>
通过以下转换正在转变:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/TOP_LEVEL">
<h3>Heading</h3>
<table style="background-color:green;">
<colgroup>
<col style="width:25%" />
<col style="width:25%" />
<col style="width:25%" />
<col style="width:25%" />
</colgroup>
<tbody>
<tr>
<th>Business Name</th>
<td><xsl:apply-templates select="ele1" /></td>
<th>Score</th>
<td><xsl:apply-templates select="ele2" /></td>
</tr>
.
.
.
</tbody>
</table>
</xsl:template>
这一切都很好,而且工作正常。但是,我有一个新的要求。
这个XML是从外部服务返回的,事实证明我不仅会拥有它的多个副本(更旧/更新的信息等),而且我可能必须将其中的一些合并在一起以供显示,并且我不确定如何最好地实现这一点。
目前,我期待我会:
<TOP_TOP_LEVEL>
<TOP_LEVEL>
<ele1 />
<ele2 />
<ele3 />
<ele4 />
<ele5 />
.
.
.
</TOP_LEVEL>
<TOP_LEVEL>
<ele1 />
<ele2 />
<ele3 />
<ele4 />
<ele5 />
.
.
.
</TOP_LEVEL>
<TOP_LEVEL>
<ele1 />
<ele2 />
<ele3 />
<ele4 />
<ele5 />
.
.
.
</TOP_LEVEL>
<TOP_LEVEL>
<ele1 />
<ele2 />
<ele3 />
<ele4 />
<ele5 />
.
.
.
</TOP_LEVEL>
</TOP_TOP_LEVEL>
但是,我如何进行翻译?我目前打算这样做:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/TOP_TOP_LEVEL">
<h3>Heading</h3>
<table style="background-color:green;">
<colgroup>
<col style="width:25%" />
<col style="width:25%" />
<col style="width:25%" />
<col style="width:25%" />
</colgroup>
<tbody>
<tr>
<th>Business Name</th>
<td><xsl:apply-templates select="child::nodes()/ele1" /></td>
<th>Score</th>
<td><xsl:apply-templates select="child::nodes()/ele2" /></td>
</tr>
.
.
.
</tbody>
</table>
</xsl:template>
也就是说,将child::nodes()
放在每个apply-templates
元素中,但是有更简洁的方法吗?这应该有效,因为尽管可能是TOP_LEVEL
的子节点的可能节点集是相同的,但是这四个节点中的每一个实际上代表了四种不同的东西,因此它们应该是所有不同(或大多数不同)的子节点。
此外,虽然我希望TOP_LEVEL[1]
中的非空注释列表与TOP_LEVEL[2]
中的非空节点列表大不相同,但某些元素可能会填充多个元素树(例如TOP_LEVEL[1]/randomElement99
和TOP_LEVEL[2]/randomElement99
可能都具有值BLURGH
,或者甚至是完全不同的值)。在这个阶段,如果有重复的内容,我很乐意在TOP_LEVEL[1]
中获取元素的值,但据我所知,上面的代码会导致它们连在一起,这比理想的。
预期的输出非常简单 - 它只是一个四列表,从XML中提取值并给出稍微更具描述性的名称。
如果相关,则在Java 7上使用Xalan 2.7.1进行此转换。
我们非常感谢任何建议。
答案 0 :(得分:0)
好吧,我确实解决了这个问题,但没有使用XSL。
相反,我只是在Java中执行了一些预处理,
简单。也就是说,我想知道我是否可以在XSL中做到这一点,所以我现在还不接受我自己的答案。