XSLT 使用来自外部文档的信息对表格进行排序

Posted

技术标签:

【中文标题】XSLT 使用来自外部文档的信息对表格进行排序【英文标题】:XSLT Sorting a table with info from external documents 【发布时间】:2018-03-24 21:02:26 【问题描述】:

我在这项任务中遇到了重大问题,我不知道如何进行排序。

我正在尝试对导入 .XSL 的 XSLT 中的表进行排序。在这个 .XSL 中,我引用了两个外部 .XSL。输出应该是 html

mainXSL.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" media-type="image/svg" indent="yes" encoding="UTF-8"/>

                <xsl:variable name="fileA" select="document(/importFiles/docs/@fileA)" />
                <xsl:variable name="fileB" select="document(/importFiles/docs/@fileB)" />
    <xsl:template match="/">
        <html>
            <head>
                <title> 
                    Task1
                </title>
            </head>        
                <body>
                    <table align="center" border="1">
                        <tr>
                            <th>column_1</th>
                            <th>column_2</th>
                        </tr>

                        <xsl:for-each select="$fileA/numbers/number">
                            <xsl:sort select="." order="ascending"/>
                                <xsl:variable name="current_node" select="position()"/>
                                    <tr>                                  
                                        <td class="_fileA"><xsl:value-of select="." /></td>
                                        <td class="_fileB"><xsl:value-of select="$fileB//animal[$current_node]" /></td>
                                    </tr>
                            </xsl:for-each>
                    </body>
               </html> 
</xsl:template>

index.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="mainXSL.xsl"?>

<importFiles>
    <docs fileA = "fileA.xml" />
    <docs fileB = "fileB.xml" /> 
</importFiles>

文件A.xml

<?xml version="1.0" encoding="UTF-8"?>

        <numbers>
            <number>A</number>
            <number>C</number>
            <number>B</number>
            <number>E</number>
            <number>D</number>
        </numbers>

文件B.xml

<?xml version="1.0" encoding="UTF-8"?>

        <animals>
            <animal>dog</animal>
            <animal>horse</animal>
            <animal>cow</animal>
            <animal>snake</animal>
            <animal>spider</animal>
        </animals>

所以fileA.xml中的数字被附加到fileB.xml中同一行的动物身上

我现在得到的是一张桌子:

1 - 狗

2 - 马

3 - 牛

4 - 蛇

5 - 蜘蛛

我想得到的是:

1 - 狗

2 - 牛

3 - 马

4 - 蜘蛛

5 - 蛇

我不知道如何在 for-each 循环之后将列排序在一起,只有 column_1。 试图在这里找到类似的问题,但无济于事。 附言。抱歉格式化,不确定缩进是否正确。

【问题讨论】:

【参考方案1】:

我认为您不想要&lt;xsl:sort select="." order="ascending"/&gt; 并将其删除,然后您可以将&lt;td class="_fileA"&gt;&lt;xsl:value-of select="position()" /&gt;&lt;/td&gt; 用于第一列,而将&lt;td class="_fileB"&gt;&lt;xsl:value-of select="$fileB//animal[position() = current()]" /&gt;&lt;/td&gt; 用于第二列。

作为我得到的完整样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" media-type="text/html" indent="yes" encoding="UTF-8"/>

    <xsl:variable name="fileA" select="document(/importFiles/docs/@fileA)" />
    <xsl:variable name="fileB" select="document(/importFiles/docs/@fileB)" />
    <xsl:template match="/">
        <html>
            <head>
                <title> 
                    Task1
                </title>
            </head>        
            <body>
                <table align="center" border="1">
                    <tr>
                        <th>column_1</th>
                        <th>column_2</th>
                    </tr>

                    <xsl:for-each select="$fileA/numbers/number">

                        <tr>                                  
                            <td class="_fileA"><xsl:value-of select="position()" /></td>
                            <td class="_fileB"><xsl:value-of select="$fileB//animal[position() = current()]" /></td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html> 
    </xsl:template>
</xsl:stylesheet>

这给了我输出

column_1    column_2
1   dog
2   cow
3   horse
4   spider
5   snake

在线https://martin-honnen.github.io/xslt/2017/test201710120301.xml。

【讨论】:

使用 position() 将在第一列中按升序为我提供数字。第二列保持不变。 @goat_pee,对不起,是的,第二列也需要更改,请参阅编辑,我对变量 current_node 的名称感到困惑。 感谢输入。出于某种原因,这不会对第一列进行排序,而第二列是空的......我无法想象没有 sort() 这样做,但话说回来,我只是 XSLT 的新手。跨度> 我已经添加了我建议的完整示例 XSLT,看起来对我来说效果很好。 这很好用,谢谢!但是,我可能错过了我的问题中的一个重要细节。假设 fileA.xml 包含字母而不是数字。我可以使用 position() 作为索引吗?

以上是关于XSLT 使用来自外部文档的信息对表格进行排序的主要内容,如果未能解决你的问题,请参考以下文章

来自外部文档的xslt复制属性

for-each 并使用 xslt 对 xml 进行排序和分组

XSLT如何仅对XML文档的字符串节点中的数值进行排序

1 个表格,1 个路线,2 个班级

XSLT 1.0 / 使用条件对每个结果进行排序

使用 Apollo Federated GraphQL,有没有办法对来自外部实体的值进行排序/分页?