xsl呈现不同父节点和排序的子节点

时间:2016-09-11 15:13:09

标签: xml sorting xslt parent-child nodes

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

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:10,高级微积分,103室 上午9:20至10:30,英国文学,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小时尚未完成,但再次感谢!

3 个答案:

答案 0 :(得分:0)

由于没有正确构建数据,您的数据提供商对您不友善 - 而且您没有提供我们可以用来进行测试的示例而对您不友好。

不过,这是你可以看到它的一种方式:

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

答案 1 :(得分:0)

我修复了你的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;

        }
    }
}

答案 2 :(得分:0)

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

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小时尚未完成,但再次感谢!