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.
的放置位置
对于新手来说,这是一项简单的编码任务还是复杂得多的任务?非常感谢您给我指点方向!
北京
更新:我想我在你的帮助下得到了它!这是一些代码...
浏览器视图:
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;
}
}
}
更新:我想我在你的帮助下得到了它!这是一些代码...
浏览器视图:
08:00 - 09:10:高级微积分,103 室
09:20 - 10:30 : 英国文学,210室
13:00 - 15:20:微积分入门,305 室
日期从 24 小时到 12 小时的转换还不能正常工作,但再次感谢!
我是 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.
的放置位置对于新手来说,这是一项简单的编码任务还是复杂得多的任务?非常感谢您给我指点方向!
北京
更新:我想我在你的帮助下得到了它!这是一些代码...
浏览器视图:
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;
}
}
}
更新:我想我在你的帮助下得到了它!这是一些代码...
浏览器视图:
08:00 - 09:10:高级微积分,103 室 09:20 - 10:30 : 英国文学,210室 13:00 - 15:20:微积分入门,305 室
日期从 24 小时到 12 小时的转换还不能正常工作,但再次感谢!