Использование XSL для сортировки XML-данных и вывода XML-файла для чтения в Classic ASP - PullRequest
0 голосов
/ 30 июля 2010

Надеюсь, это будет простое исправление. Я совершенно новичок в 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 &amp; 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 до

Ответы [ 2 ]

1 голос
/ 30 июля 2010

Эта таблица стилей:

<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 &amp; 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 &amp; 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 &amp; Cardio.</td>
        <td>Suzanne Marsello</td>
        <td>n/a</td>
    </tr>
</table>
1 голос
/ 30 июля 2010

Есть две проблемы с вашим XSL.

Во-первых, когда вы копируете элемент gm, вы неправильно закрыли тег gm.

<gm><xsl:value-of select="gm"/><gm> 

Это должно стать

<gm><xsl:value-of select="gm"/></gm> 

Во-вторых, несмотря на то, что вы копируете элементы Shift, ваш результирующий XML не содержит корневого элемента. Вам нужно поместить элемент Rota вне вашего вызова xsl: apply-templates

<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))

Используйте load при загрузке xml из файла. Используйте loadXml при загрузке строки, содержащей Xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...