xsl渲染不同父节点的子节点并排序

xsl render children of different parent nodes and sort

我是 XML/XSL 的新手,需要一些帮助来显示和排序存储在两个不同父节点的子节点中的值(即数据是 "cousins")。

XML 文件包含今天在我们建筑物的不同房间发生的事件的时间表。每个事件都由 <event> 标记表示,其中包含 <space><event_details> 节点,每个节点都有子节点,其中存储了我要显示和排序的值。它基本上具有以下结构(使用下面有两条记录的示例,为了便于阅读,删除了结束标记):

<schedule>

    <event>
        <space>
            <space_name>Room 210
        <event_details>
            <event_name>English Literature
            <event_startandendtime>9:20am to 10:30am
    <event>
        <space>
            <space_name>Room 103
        <event_details>
            <event_name>Advanced Calculus
            <event_startandendtime>8:00am to 9:10am 

我正在尝试使用 XSL 输出包含按日期顺序列出的事件的日程表,格式如下:

event_startandendtime, event_name, space_name
event_startandendtime、event_name、space_name

例如:

上午 8:00 到 9:10am,高等微积分,103 室
9:20am 至 10:30am,英国文学,210 室

到目前为止,我一直没有成功。在一次对其编码的尝试中,我可以生成一个排序列表,但我无法让 space_name 出现。在另一次尝试中,我可以获得 space_name,但无法获得排序列表,我也无法控制 space_name.

的放置位置

对于新手来说,这是一项简单的编码任务还是复杂得多的任务?非常感谢您给我指点方向!

北京

更新:我想我在你的帮助下得到了它!这是一些代码...

Screenshot of XML Code

Screenshot of XSL Code

浏览器视图:

08:00 - 09:10 : Advanced Calculus, Room 103
09:20 - 10:30 : English Literature, Room 210
13:00 - 15:20 : Beginning Calculus, Room 305

日期从 24 小时到 12 小时的转换还不能正常工作,但再次感谢!

您的数据提供者没有正确构建数据,这对您不友善 - 并且您没有提供我们可以按原样用于测试的示例,对我们不友善。

不过,您可以通过以下方式查看它:

XSLT 1.0

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

<xsl:template match="/root">
    <body>
        <xsl:for-each select="event">
            <!-- 1. AM before PM -->
            <xsl:sort select="contains(substring-before(event_details/event_startandendtime, ' '), 'pm')" data-type="text" order="ascending"/>
            <!-- 2. Sort by hour (convert 12 to 0) -->
            <xsl:sort select="substring-before(event_details/event_startandendtime, ':') mod 12" data-type="number" order="ascending"/>
            <!-- 3. Sort by minute -->
            <xsl:sort select="substring(substring-after(event_details/event_startandendtime, ':'), 1, 2)" data-type="number" order="ascending"/>
             <!-- output -->           
            <xsl:value-of select="event_details/event_startandendtime"/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="event_details/event_name"/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="space/space_name" disable-output-escaping="yes"/>
            <br/>
        </xsl:for-each>
    </body>
</xsl:template>

</xsl:stylesheet>

应用于以下测试输入:

XML

<root>
  <event>
    <space>
      <space_name>Room 210</space_name>
    </space>
    <event_details>
      <event_name>English Literature</event_name>
      <event_startandendtime>9:20am to 10:30am</event_startandendtime>
    </event_details>
  </event>
   <event>
    <space>
      <space_name>Room 305</space_name>
    </space>
    <event_details>
      <event_name>Beginning Calculus</event_name>
      <event_startandendtime>1:00pm to 3:20pm</event_startandendtime>
    </event_details>
  </event>
 <event>
    <space>
      <space_name>Room 103</space_name>
    </space>
    <event_details>
      <event_name>Advanced Calculus</event_name>
      <event_startandendtime>8:00am to 9:10am</event_startandendtime>
    </event_details>
  </event>
</root>

(呈现的)结果将是:

8:00am to 9:10am, Advanced Calculus, Room 103
9:20am to 10:30am, English Literature, Room 210
1:00pm to 3:20pm, Beginning Calculus, Room 305

我修复了你的 xml 文件

xml

<Root>
<event>
    <space>
        <space_name>Room 210</space_name>
    </space>
    <event_details>
        <event_name>English Literature</event_name>
        <event_startandendtime>9:20am to 10:30am</event_startandendtime>
    </event_details>
</event>
<event>
    <space>
        <space_name>Room 103</space_name>
    </space>
    <event_details>
        <event_name>Advanced Calculus</event_name>
        <event_startandendtime>8:00am to 9:10am</event_startandendtime>
    </event_details>
</event>
</Root> 

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        const string FILENAME = @"c:\temp\test.xml";
        public Form1()
        {
            InitializeComponent();

            DataTable dt = new DataTable();
            dt.Columns.Add("Room", typeof(string));
            dt.Columns.Add("Event", typeof(string));
            dt.Columns.Add("Time", typeof(string));

            XDocument doc = XDocument.Load(FILENAME);

            foreach(XElement _event in doc.Descendants("event"))
            {
                dt.Rows.Add(new object[] {
                   (string)_event.Descendants("space_name").FirstOrDefault(),
                   (string)_event.Descendants("event_name").FirstOrDefault(),
                   (string)_event.Descendants("event_startandendtime").FirstOrDefault()
               });
            }

            dt = dt.AsEnumerable()
                .OrderBy(x => x.Field<string>("Room"))
                .ThenBy(x => x.Field<string>("Time"))
                .ThenBy(x => x.Field<string>("Event"))
                .CopyToDataTable();

            dataGridView1.DataSource = dt;

        }
    }
}

更新:我想我在你的帮助下得到了它!这是一些代码...

XML: Screenshot of XML Code

XSL:Screenshot of XSL Code

浏览器视图:

08:00 - 09:10:高级微积分,103 室 09:20 - 10:30 : 英国文学,210室 13:00 - 15:20:微积分入门,305 室

日期从 24 小时到 12 小时的转换还不能正常工作,但再次感谢!