[英]Using XSL to sort XML data then output an XML file to be read by Classic ASP
希望这将是一个简单的修复。 我对XSL完全陌生,但是我设法获得了一个按日期对我的数据进行排序的小脚本。 我现在想使用ASP将数据限制在一个月内的所有条目中(通过使用DateDiff()函数可正常工作)。 当我在XSL脚本输出中加载时,它说我的XML格式错误。 有人可以帮我吗?
这是我的XML文件:
<?xml version="1.0"?>
<Rota>
<Shift>
<date>23/07/2010</date>
<title1>GM Neurosciences</title1>
<gm>Katie Cusick</gm>
<title2>Chief Operating Officer</title2>
<director>Patrick Mitchell</director>
<nurse>n/a</nurse>
</Shift>
<Shift>
<date>30/07/2010</date>
<title1>GM Specialised Medicine</title1>
<gm>Alison Watson</gm>
<title2>DDO Medicine & Cardio.</title2>
<director>Suzanne Marsello</director>
<nurse>n/a</nurse>
</Shift>
</Rota>
这是我的XSL文件:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="no" version="1.0" />
<xsl:param name="sortBy" select="'date'"/>
<xsl:param name="strXPath" select="//Shift"/>
<xsl:template match="/">
<xsl:apply-templates select="$strXPath">
<xsl:sort select="substring(date,7,4)"/> <!-- year sort -->
<xsl:sort select="substring(date,4,2)"/> <!-- month sort -->
<xsl:sort select="substring(date,1,2)"/> <!-- day sort -->
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Shift">
<Shift>
<date><xsl:value-of select="date"/></date>
<title1><xsl:value-of select="title1"/></title1>
<gm><xsl:value-of select="gm"/><gm>
<title2><xsl:value-of select="title2"/></title2>
<director><xsl:value-of select="director"/></director>
<nurse><xsl:value-of select="nurse"/></nurse>
</Shift>
</xsl:template>
</xsl:stylesheet>
这是我的ASP代码:
<%
Set entries = Server.CreateObject("Microsoft.XMLDOM")
Set entry = Server.CreateObject("Microsoft.XMLDOM")
Set xml = Server.CreateObject("Microsoft.XMLDOM")
Set xsl = Server.CreateObject("Microsoft.XMLDOM")
Set newxml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = False
xml.load (Server.MapPath("rota.xml"))
xsl.async = False
xsl.load(Server.MapPath("indexrota.xsl"))
newxml.async = False
newxml.load(xml.transformNode(xsl))
set entries = newxml.getElementsbyTagName("Shift")
noOfEntries = entries.length
startDate = "15/07/2010"
LastDate = DateAdd("m",1,date())
Response.Write("<table><tr><th>Date</th><th>Title</th><th>GM</th><th>Title</th><th>Director</th><th>Nurse / Matron</th></tr>")
For i = 0 To (noOfEntries - 1)
Set entry = entries.item(i)
If isDate(entry.childNodes(0).text) Then
meh = CDate(entry.childNodes(0).text)
beginning = DateDiff("d", meh, startDate)
ended = DateDiff("d", meh, LastDate)
If beginning + 1 <= 0 And ended >= 0 Then
Response.Write("<tr>"&_
"<td>" & entry.childNodes(0).text & "</td>"&_
"<td>" & entry.childNodes(1).text & "</td>"&_
"<td>" & entry.childNodes(2).text & "</td>"&_
"<td>" & entry.childNodes(3).text & "</td>"&_
"<td>" & entry.childNodes(4).text & "</td>"&_
"<td>" & entry.childNodes(5).text & "</td>"&_
"</tr>")
End If
End If
Next
Response.Write("</table>")
%>
我确信这是XSL的一种情况,因为ASP之前在XML上已经完美地工作了
XSL存在两个问题。
首先,在复制gm元素的地方,您没有正确关闭gm标签。
<gm><xsl:value-of select="gm"/><gm>
这应该成为
<gm><xsl:value-of select="gm"/></gm>
其次,尽管您正在复制Shift元素,但是生成的XML不包含根元素。 您需要在xsl:apply-templates调用外部放置Rota元素
<xsl:template match="/">
<Rota>
<xsl:apply-templates select="$strXPath">
<xsl:sort select="substring(date,7,4)"/> <!-- year sort -->
<xsl:sort select="substring(date,4,2)"/> <!-- month sort -->
<xsl:sort select="substring(date,1,2)"/> <!-- day sort -->
</xsl:apply-templates>
</Rota>
</xsl:template>
请注意,您只需执行以下操作即可简化Shift元素的复制
<xsl:template match="Shift">
<xsl:copy-of select="." />
</xsl:template>
ASP代码也存在问题。 行newxml.load(xml.transformNode(xsl))不正确。 由于transformNode返回包含XML的字符串,因此您实际上需要执行以下操作
newxml.loadXml(xml.transformNode(xsl))
从文件加载xml时使用load 。 加载包含Xml的字符串时使用loadXml
这个样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Rota">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="substring(date,7)"/>
<xsl:sort select="substring(date,4,2)"/>
<xsl:sort select="substring(date,1,2)"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
有了这个输入:
<Rota>
<Shift>
<date>30/07/2010</date>
<title1>GM Specialised Medicine</title1>
<gm>Alison Watson</gm>
<title2>DDO Medicine & Cardio.</title2>
<director>Suzanne Marsello</director>
<nurse>n/a</nurse>
</Shift>
<Shift>
<date>23/07/2010</date>
<title1>GM Neurosciences</title1>
<gm>Katie Cusick</gm>
<title2>Chief Operating Officer</title2>
<director>Patrick Mitchell</director>
<nurse>n/a</nurse>
</Shift>
</Rota>
输出:
<Rota>
<Shift>
<date>23/07/2010</date>
<title1>GM Neurosciences</title1>
<gm>Katie Cusick</gm>
<title2>Chief Operating Officer</title2>
<director>Patrick Mitchell</director>
<nurse>n/a</nurse>
</Shift>
<Shift>
<date>30/07/2010</date>
<title1>GM Specialised Medicine</title1>
<gm>Alison Watson</gm>
<title2>DDO Medicine & Cardio.</title2>
<director>Suzanne Marsello</director>
<nurse>n/a</nurse>
</Shift>
</Rota>
此外,此样式表也适用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="substring(date,7)"/>
<xsl:sort select="substring(date,4,2)"/>
<xsl:sort select="substring(date,1,2)"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
注意 :正确的子字符串。 我更改输入顺序,因为默认顺序是升序的。 如果要后代顺序添加到xsl:sort
此属性order="descending"
。
编辑 :恢复错误的子字符串。 另外,为什么不使用XSLT来完成所有工作? 例如,此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="startDate" select="20100715"/>
<xsl:param name="endDate" select="$startDate + 100"/>
<xsl:template match="Rota">
<table>
<tr>
<th>Date</th>
<th>Title</th>
<th>GM</th>
<th>Title</th>
<th>Director</th>
<th>Nurse / Matron</th>
</tr>
<xsl:apply-templates select="Shift[concat(substring(date,7),
substring(date,4,2),
substring(date,1,2))
>= $startDate]
[$endDate >=
concat(substring(date,7),
substring(date,4,2),
substring(date,1,2))]">
<xsl:sort select="substring(date,7)"/>
<xsl:sort select="substring(date,4,2)"/>
<xsl:sort select="substring(date,1,2)"/>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="Shift">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="Shift/*">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
</xsl:stylesheet>
输出:
<table>
<tr>
<th>Date</th>
<th>Title</th>
<th>GM</th>
<th>Title</th>
<th>Director</th>
<th>Nurse / Matron</th>
</tr>
<tr>
<td>23/07/2010</td>
<td>GM Neurosciences</td>
<td>Katie Cusick</td>
<td>Chief Operating Officer</td>
<td>Patrick Mitchell</td>
<td>n/a</td>
</tr>
<tr>
<td>30/07/2010</td>
<td>GM Specialised Medicine</td>
<td>Alison Watson</td>
<td>DDO Medicine & Cardio.</td>
<td>Suzanne Marsello</td>
<td>n/a</td>
</tr>
</table>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.