XSL将多个节点树组合成HTML输出

时间:2014-03-27 04:34:25

标签: xml xslt

快速注意:我受限于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]/randomElement99TOP_LEVEL[2]/randomElement99可能都具有值BLURGH,或者甚至是完全不同的值)。在这个阶段,如果有重复的内容,我很乐意在TOP_LEVEL[1]中获取元素的值,但据我所知,上面的代码会导致它们连在一起,这比理想的。

预期的输出非常简单 - 它只是一个四列表,从XML中提取值并给出稍微更具描述性的名称。

如果相关,则在Java 7上使用Xalan 2.7.1进行此转换。

我们非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

好吧,我确实解决了这个问题,但没有使用XSL。

相反,我只是在Java中执行了一些预处理,

  1. 创建了一个新文档。
  2. 通过我必须合并的每个文档中的子元素进行迭代。
  3. 在此新文档中添加了该元素的克隆(如果它们尚未存在)。
  4. 简单。也就是说,我想知道我是否可以在XSL中做到这一点,所以我现在还不接受我自己的答案。