XSLT以任意顺序排序输入

时间:2016-07-21 11:27:22

标签: html xml xslt

我对XSLT很陌生。我在网上进行了大量的研究,但是找不到适合我个人情况的足够信息。

这就是我想要实现的目标: 我有一个包含10到15个部分的大型XML文档。结构或多或少如下所示:

<headerSection>
    <!-- lots of stuff in here -->
</headerSection>
<containerSection>
    <bodySection>
        <container1>
            <container2>
                <identifier code="12345"/>
                <!-- lots of stuff in here -->
            </container2>
        </container1>
        <container1>
            <container2>
                <identifier code="98765"/>
                <!-- lots of stuff in here -->
            </container2>
        </container1>
    </bodySection>
</containerSection>

我有一个应用于此的XSL文件,以便输出样式化的HTML页面。 现在,我想要做的是以任意顺序呈现<bodySection>的子项。确定顺序的标准是code元素中的<identifier>属性。
让我再次澄清,排序应该是任意的。

我知道我可以使用xsl:sort指令执行此操作,但是我是一个巨大的XSL新手,而且我还没有从我发现的示例中得到如何使用它线上。
要点是我要生成一个样式化的HTML页面,而不是&#34;只是&#34;转换XML输入。

看起来最接近我尝试做的是这个片段:

<xsl:param name="pOrder" select="'professionalsection,educationalsection'"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*">
            <xsl:sort select="string-length(
                                 substring-before(
                                    concat(',',$pOrder,','),
                                    concat(',',name(),',')))"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

不幸的是,我不太确定如何在我的情况下使用它。 直觉上,我会尝试更改select="'professionalsection,educationalsection'"中指出的值,但这是正确的方法吗? 非常感谢任何帮助!

更新

通过查看评论中发布的示例,我想出了这个。我希望它能更准确地描述我想要做的事情:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="bodySection">
    <xsl:variable name="sort-order">|98765|12345|</xsl:variable>
    <xsl:copy>
        <xsl:apply-templates select="@*|node()">
            <xsl:sort select="string-length(substring-before($sort-order, concat('|', container1/container2/identifier/@code, '|')))" data-type="number" order="descending"/>
        </xsl:apply-templates>  
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

上面的代码片段尚无法解决。我试图实现的结果如下:

    <headerSection>
    <!-- lots of stuff in here -->
</headerSection>
<containerSection>
    <bodySection>
        <container1>
            <container2>
                <identifier code="98765"/>
                <!-- lots of stuff in here -->
            </container2>
        </container1>
        <container1>
            <container2>
                <identifier code="12345"/>
                <!-- lots of stuff in here -->
            </container2>
        </container1>
    </bodySection>
</containerSection>

...交换元素container1(及其子元素)。

1 个答案:

答案 0 :(得分:1)

尝试:

<xsl:sort select="string-length(substring-before($sort-order, concat('|', container2/identifier/@code, '|')))" data-type="number" order="ascending"/>