Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT:使用多个键创建网格_Xml_Xslt_Key_Xmltable - Fatal编程技术网

Xml XSLT:使用多个键创建网格

Xml XSLT:使用多个键创建网格,xml,xslt,key,xmltable,Xml,Xslt,Key,Xmltable,这是我上一个问题的后续问题。我从采用以下格式的表格网格开始: A1,B1,C1 A2,B2,C2 A3,B3,C3 现在,根据记录中的实例值,此结果表最多重复5次。对于表的每个实例,单元格中的值将不同 我正在使用的XML为每个记录提供一个单元格值,以及DayOfWeek(列)、Stream(行)和Instance(表的迭代)值 多亏了前面的助手,我现在有了XSLT,它允许我创建一个网格(列x行)。但是,当我添加一个额外的键(按实例逐行)来迭代实例时,XSLT失败了 目标结果如下所示: In

这是我上一个问题的后续问题。我从采用以下格式的表格网格开始:

A1,B1,C1

A2,B2,C2

A3,B3,C3
现在,根据记录中的实例值,此结果表最多重复5次。对于表的每个实例,单元格中的值将不同

我正在使用的XML为每个记录提供一个单元格值,以及DayOfWeek(列)、Stream(行)和Instance(表的迭代)值

多亏了前面的助手,我现在有了XSLT,它允许我创建一个网格(列x行)。但是,当我添加一个额外的键(按实例逐行)来迭代实例时,XSLT失败了

目标结果如下所示:

Instance 1
 A1,B1,C1

 A2,  ,C2

 A3,B3,C3

Instance 2
 D1,E1,F1

 D2,  ,F2

 D3,E3,F3
一周中最多可以有5个实例、7天以及任意数量的行

更新 在Michael的贡献之后,我更新了XSLT,但是我仍然没有更新。目前的结果是

A1 A1 A1 A1 B1 B1 B1 C1 C1 C1 C1
A2 A2 A2 A2          C2 C2 C2 C2
A3 A3 A3 A3 B3 B3 B3 C3 C3 C3 C3

A1 A1 A1 A1 B1 B1 B1 C1 C1 C1 C1
A2 A2 A2 A2          C2 C2 C2 C2
A3 A3 A3 A3 B3 B3 B3 C3 C3 C3 C3
我对表进行了两次迭代,但它们包含相同的数据,并且列重复了太多次

XSL:


XML:


1.
1.
1.
A1
1.
1.
2.
地下一层
1.
1.
3.
C1
1.
2.
1.
A2
1.
2.
3.
C2
1.
3.
1.
A3
1.
3.
2.
地下三层
1.
3.
3.
C3
2.
1.
1.
D1
2.
1.
2.
E1
2.
1.
3.
一层楼
2.
2.
1.
D2
2.
2.
3.
E2
2.
3.
1.
D3
2.
3.
2.
E3
2.
3.
3.
F3

嗯,你在路上拐错了几个弯。看看这是否有助于你回到正轨:

XSLT1.0

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

<xsl:key name="row-by-instance" match="DataRow" use="Instance" />
<xsl:key name="row-by-day" match="DataRow" use="DayOfWeek" />
<xsl:key name="row-by-stream" match="DataRow" use="concat(Instance, '|', Stream)" />

<xsl:template match="/QueryResults">
    <!-- a column for each distinct day of week (in any instance) -->
    <xsl:variable name="columns" select="DataRow[generate-id() = generate-id(key('row-by-day', DayOfWeek)[1])]" />
    <!-- a table for each distinct instance -->
    <xsl:for-each select="DataRow[count(. | key('row-by-instance', Instance)[1]) = 1]">
        <xsl:variable name="instance-rows" select="key('row-by-instance', Instance)" />
        <table border="1">
            <!-- a row for each distinct stream in this instance -->
            <xsl:for-each select="$instance-rows[generate-id() = generate-id(key('row-by-stream', concat(Instance, '|', Stream))[1])]">
                <xsl:variable name="stream-rows" select="key('row-by-stream', concat(Instance, '|', Stream))" />
                <tr>
                    <!-- a cell for each column -->
                    <xsl:for-each select="$columns">
                        <xsl:sort select="DayOfWeek" data-type="number" order="ascending"/>
                        <td>
                            <xsl:value-of select="$stream-rows[DayOfWeek = current()/DayOfWeek]/DisplayStuff" />
                        </td>
                    </xsl:for-each>
                </tr>
            </xsl:for-each>
        </table>
    </xsl:for-each>
</xsl:template>     

</xsl:stylesheet>



请注意,这将为所有表生成一组列,以便表对齐。如果您希望每个表都有自己的列(即跳过没有数据的一周中的几天),那么您将不得不做不同的事情-最重要的是,您需要在
行中按天
键包含
实例

不清楚实例是什么意思。转换给定输入示例的预期结果是什么?抱歉-我添加了预期的输出和一些更详细的信息。我不理解您的输出。每个实例都应该是一个单独的表,还是什么?是的。因此,for-each循环围绕着表,您需要从按实例分组行开始。然后,在每个实例中,按流对它们进行分组。为此,您将需要一个连接实例和流的键。你可以在这里找到许多这种方法的例子,这里有一个:
    <?xml version="1.0" encoding="UTF-8"?>
<QueryResults>
<DataRow>
    <Instance>1</Instance>
    <Stream>1</Stream>
    <DayOfWeek>1</DayOfWeek>
    <DisplayStuff>A1</DisplayStuff>
</DataRow>
<DataRow>
    <Instance>1</Instance>
    <Stream>1</Stream>
    <DayOfWeek>2</DayOfWeek>
    <DisplayStuff>B1</DisplayStuff>
</DataRow>
<DataRow>
    <Instance>1</Instance>
    <Stream>1</Stream>
    <DayOfWeek>3</DayOfWeek>
    <DisplayStuff>C1</DisplayStuff>
</DataRow>
<DataRow>
    <Instance>1</Instance>
    <Stream>2</Stream>
    <DayOfWeek>1</DayOfWeek>
    <DisplayStuff>A2</DisplayStuff>
</DataRow>

<DataRow>
    <Instance>1</Instance>
    <Stream>2</Stream>
    <DayOfWeek>3</DayOfWeek>
    <DisplayStuff>C2</DisplayStuff>
</DataRow>
<DataRow>
    <Instance>1</Instance>
    <Stream>3</Stream>
    <DayOfWeek>1</DayOfWeek>
    <DisplayStuff>A3</DisplayStuff>
</DataRow>
<DataRow>
    <Instance>1</Instance>
    <Stream>3</Stream>
    <DayOfWeek>2</DayOfWeek>
    <DisplayStuff>B3</DisplayStuff>
</DataRow>
<DataRow>
    <Instance>1</Instance>
    <Stream>3</Stream>
    <DayOfWeek>3</DayOfWeek>
    <DisplayStuff>C3</DisplayStuff>
</DataRow>
    <DataRow>
        <Instance>2</Instance>
        <Stream>1</Stream>
        <DayOfWeek>1</DayOfWeek>
        <DisplayStuff>D1</DisplayStuff>
    </DataRow>
    <DataRow>
        <Instance>2</Instance>
        <Stream>1</Stream>
        <DayOfWeek>2</DayOfWeek>
        <DisplayStuff>E1</DisplayStuff>
    </DataRow>
    <DataRow>
        <Instance>2</Instance>
        <Stream>1</Stream>
        <DayOfWeek>3</DayOfWeek>
        <DisplayStuff>F1</DisplayStuff>
    </DataRow>
    <DataRow>
        <Instance>2</Instance>
        <Stream>2</Stream>
        <DayOfWeek>1</DayOfWeek>
        <DisplayStuff>D2</DisplayStuff>
    </DataRow>

    <DataRow>
        <Instance>2</Instance>
        <Stream>2</Stream>
        <DayOfWeek>3</DayOfWeek>
        <DisplayStuff>E2</DisplayStuff>
    </DataRow>
    <DataRow>
        <Instance>2</Instance>
        <Stream>3</Stream>
        <DayOfWeek>1</DayOfWeek>
        <DisplayStuff>D3</DisplayStuff>
    </DataRow>
    <DataRow>
        <Instance>2</Instance>
        <Stream>3</Stream>
        <DayOfWeek>2</DayOfWeek>
        <DisplayStuff>E3</DisplayStuff>
    </DataRow>
    <DataRow>
        <Instance>2</Instance>
        <Stream>3</Stream>
        <DayOfWeek>3</DayOfWeek>
        <DisplayStuff>F3</DisplayStuff>
    </DataRow>       
</QueryResults>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="row-by-instance" match="DataRow" use="Instance" />
<xsl:key name="row-by-day" match="DataRow" use="DayOfWeek" />
<xsl:key name="row-by-stream" match="DataRow" use="concat(Instance, '|', Stream)" />

<xsl:template match="/QueryResults">
    <!-- a column for each distinct day of week (in any instance) -->
    <xsl:variable name="columns" select="DataRow[generate-id() = generate-id(key('row-by-day', DayOfWeek)[1])]" />
    <!-- a table for each distinct instance -->
    <xsl:for-each select="DataRow[count(. | key('row-by-instance', Instance)[1]) = 1]">
        <xsl:variable name="instance-rows" select="key('row-by-instance', Instance)" />
        <table border="1">
            <!-- a row for each distinct stream in this instance -->
            <xsl:for-each select="$instance-rows[generate-id() = generate-id(key('row-by-stream', concat(Instance, '|', Stream))[1])]">
                <xsl:variable name="stream-rows" select="key('row-by-stream', concat(Instance, '|', Stream))" />
                <tr>
                    <!-- a cell for each column -->
                    <xsl:for-each select="$columns">
                        <xsl:sort select="DayOfWeek" data-type="number" order="ascending"/>
                        <td>
                            <xsl:value-of select="$stream-rows[DayOfWeek = current()/DayOfWeek]/DisplayStuff" />
                        </td>
                    </xsl:for-each>
                </tr>
            </xsl:for-each>
        </table>
    </xsl:for-each>
</xsl:template>     

</xsl:stylesheet>