Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

xanburzum

[Resolvido] Buscando um arquivo XML com XSL

Recommended Posts

Busca de arquivos XML para atualizar ou excluir registros

 

Permite listar os registros no arquivo XML. Esse arquivo XML contém uma lista de contatos. Nós vamos usar um arquivo XSL para transformar o arquivo XML em HTML para visualização em um navegador. Usando ASP, iremos realizar a transformação no servidor para que possamos evitar problemas de incompatibilidade do navegador.

 

Listagem do conteúdo do arquivo XML

Aqui está uma listagem do conteúdo do arquivo XML.

<?xml version="1.0" ?>
<rolodex>
 <contact>
  <field id="firstName" taborder="1">
   <field_value>Reggie</field_value>
  </field>
  <field id="lastName" taborder="2">
   <field_value>Walls</field_value>
  </field>
  <field id="address1" taborder="3">
   <field_value>202 East Haverbrook</field_value>
  </field>
  <field id="address2" taborder="4">
   <field_value>Oklahoma City, OK 73114</field_value>
  </field>
  <field id="phone" taborder="5">
   <field_value>4055551234</field_value>
  </field>
  <field id="email" taborder="6">
   <field_value>reggiew@vertiscope.com</field_value>
  </field>
 </contact>
 <contact>
  <field id="firstName" taborder="1">
   <field_value>Nancy</field_value>
  </field>
  <field id="lastName" taborder="2">
   <field_value>Quick</field_value>
  </field>
  <field id="address1" taborder="3">
   <field_value>2000 East Brooks</field_value>
  </field>
  <field id="address2" taborder="4">
   <field_value>Oklahoma City, OK 73114</field_value>
  </field>
  <field id="phone" taborder="5">
   <field_value>4055522345</field_value>
  </field>
  <field id="email" taborder="6">
   <field_value>nancyq@vertiscope.com</field_value>
  </field>
 </contact>
 <contact>
  <field id="firstName" taborder="1">
   <field_value>Gerry</field_value>
  </field>
  <field id="lastName" taborder="2">
   <field_value>Mays</field_value>
  </field>
  <field id="address1" taborder="3">
   <field_value>303 Cranston Street</field_value>
  </field>
  <field id="address2" taborder="4">
   <field_value>Oklahoma City, OK 73114</field_value>
  </field>
  <field id="phone" taborder="5">
   <field_value>4055259999</field_value>
  </field>
  <field id="email" taborder="6">
   <field_value>gerrym@vertiscope.com</field_value>
  </field>
 </contact>
 <contact>
  <field id="firstName" taborder="1">
   <field_value>Jenny</field_value>
  </field>
  <field id="lastName" taborder="2">
   <field_value>Woos</field_value>
  </field>
  <field id="address1" taborder="3">
   <field_value>110 Crown Drive</field_value>
  </field>
  <field id="address2" taborder="4">
   <field_value>Oklahoma City, OK 73114</field_value>
  </field>
  <field id="phone" taborder="5">
   <field_value>4055559873</field_value>
  </field>
  <field id="email" taborder="6">
   <field_value>jennyw@vertiscope.com</field_value>
  </field>
 </contact>
</rolodex>

Aqui está o arquivo XSL que será usado para transformar o arquivo XML.

 

rolodex.xsl:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
 <html>
 <body>
 <h1>Contacts</h1>
 <table border="1" cellpadding="2">
 <tr>
 <td>Name</td>
 <td>E-Mail</td>
 </tr>
 <xsl:for-each select="rolodex/contact">
  <tr>
  <td>
  <a>
  <xsl:attribute name="href">rolodex6.asp?
  mode=viewdetail&email=<xsl:value-of select="field
  [@id='email']/field_value"/></xsl:attribute><xsl:value-of
  select="field[@id='firstName']/field_value"/>
  </a>
  </td>
  <td><xsl:value-of select="field[@id='email']/field_value"/></td>
  </tr>
 </xsl:for-each>
 </table>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>

Esse arquivo XSL itera o conteúdo do arquivo XML e exibe em uma tabela HTML. A exposição permite que o viewer da tabela para clicar em um nome de contato para ver os detalhes do contato. Permite ter uma olhada inicial no arquivo rolodex.asp. Este é o arquivo que tranforms o arquivo XML no servidor.

 

rolodex.asp:

 

<%

Function loadXMLFile(strXMLFile, strXSLFile)

 'Declare local variables
 Dim objXML
 Dim objXSL

 'Instantiate the XMLDOM Object that will hold the XML file.
 set objXML = Server.CreateObject("Microsoft.XMLDOM")

 'Turn off asyncronous file loading.
 objXML.async = false

 'Load XML
 objXML.load(strXMLFile)

 'Instantiate the XMLDOM Object that will hold the XSL file.
 set objXSL = Server.CreateObject("Microsoft.XMLDOM")

 ' off asyncronous file loading.
 objXSL.async = false

 'Load XSL
 objXSL.load(strXSLFile)


 Response.Write(objXML.transformNode(objXSL))
End Function


loadXMLFile server.MapPath("rolodex.xml"), server.MapPath("rolodex.xsl")
%>

Uma coisa que você vai notar sobre este código é que clicar no link para ver detalhes do contato simplesmente recarrega a lista e não exibir o detalhe. Nós precisamos adicionar essa funcionalidade. No entanto, você também irá notar que vários parâmetros de seqüência de consulta são acrescentados a URL, quando o nome do contato é clicado. O primeiro parâmetro é o "mode", que conta rolodex.asp deve ser executado quando a página é carregada. O segundo string parameter de consulta é "email" que é usado para identificar o contacto.

 

A fim de visualizar os detalhes de um contato, precisamos ser capazes de pesquisar o arquivo XML e retornar o registro desejado. Nós vamos adicionar um novo método para rolodex.asp, a fim de conseguir isso.

 

Visualizando registro detalhe XML:

O método VIEWDETAIL será usado para pesquisar o arquivo XML para um registro específico.

 

'-------------------------------------------------------------------
Function viewDetail(strXMLFile, strXSLFile, strEMail)


 Dim objXML
 Dim objNode
 Dim objXSL


 set objXML = Server.CreateObject("Microsoft.XMLDOM")


 objXML.async = false

 'Load XML 
 objXML.load(strXMLFile)


 Set objNode = objXML.SelectSingleNode("rolodex/contact
 [field/field_value='" & strEMail & "']")

 'Instantiate the XMLDOM Object that will hold the XSL file.
 set objXSL = Server.CreateObject("Microsoft.XMLDOM")

 'Turn off asyncronous .
 objXSL.async = false

 'Load the XSL file.
 objXSL.load(strXSLFile)


 Response.Write(objNode.transformNode(objXSL))
End Function

O método VIEWDETAIL consulta o arquivo XML, chamando o método SelectSingleNode do objeto XMLDOM. Este método aceita uma string de consulta para localizar o nó (registro) que você deseja ler. Neste caso, passamos no E-Mail do contato que nós queremos ver detalhe para. Você também deve notar que neste método, quando chamamos o método transformNode, estamos transformando apenas o nó que temos a partir SelectSingeNode e não todo o documento XML.

 

Desde que nós estamos vendo os detalhes de um registro XML, vamos precisar de um outro arquivo XSL para transformar o arquivo XML.

 

viewdetail.xsl:

 

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="rolodex/contact">
 <html>
 <body>
 <h1>Contact Detail</h1>
 <table border="1" cellpadding="2">
 <xsl:for-each select="field">
  <tr>
  <td>
  <xsl:value-of select="@id"/>
  </td>
  <td>
  <xsl:value-of select="field_value"/>
  </td>
  </tr>
 </xsl:for-each>
 </table>
 <table border="0" cellpadding="2">
 <tr>
 <td>
 <a>
 <xsl:attribute name="href">rolodex6.asp?
 mode=editdetail&email=<xsl:value-of select="field
 [@id='email']/field_value" /></xsl:attribute>Edit this record
 </a>
 </td>
 </tr>
 <tr>
 <td>
 <a>
 <xsl:attribute name="href">rolodex6.asp?
 mode=deletedetail&email=<xsl:value-of select="field
 [@id='email']/field_value" /></xsl:attribute>Delete this record
 </a>
 </td>
 </tr>
 <tr>
 <td>
 <a>
 <xsl:attribute name="href">rolodex6.asp</xsl:attribute>Return to
 contact list
 </a>
 </td>
 </tr>
 </table>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>

Uma coisa que nós fizemos neste arquivo XSL, após os detalhes do registro XML foram formatados em uma tabela HTML, é adicionado três hiperlinks. O primeiro é um link para editar , o segundo é um link para excluir este registro, e o terceiro é um link para retornar à lista principal.

 

Finalmente, depois de ter adicionado o método VIEWDETAIL para o arquivo rolodex.asp, precisamos adicionar lógica para rolodex.asp para que VIEWDETAIL irá executar quando é suposto.

 

<%
Dim strMode
Dim strEMail


strMode = Request.QueryString("mode")
strEMail = Request.QueryString("email")


Select Case strMode
 Case "viewdetail"


  viewDetail server.MapPath("rolodex6.xml"),server.MapPath
  ("viewdetail.xsl"),strEMail
 Case Else

  loadXMLFile server.MapPath("rolodex6.xml"), server.MapPath
  ("rolodex6.xsl")
End Select
%>

Você pode perguntar por que nós usamos uma instrução Select Case na listagem de código passado ao invés de uma instrução If ... Then ... Else. A razão é que nós vamos estar adicionando mais diversos casos.

 

Com o código que tenha adicionado à rolodex.asp estamos agora em condições para ver a lista de contactos e podemos ver os detalhes de um contacto seleccionado. No entanto, quando visualizar os detalhes do contacto, há links para editar e apagar o contacto. Nós precisamos de adicionar código para lidar com essas ações.

 

Editando XML registro detalhe:

 

Vamos agora adicionar lógica para rolodex.asp para permitir que o usuário final para editar o registro detalhe XML. O método VIEWDETAIL pode realmente ser usada para formatar o registro XML selecionado em um formulário HTML para edição. É apenas uma questão de passar em uma folha de estilo diferente, editdetail.xsl, ao chamar o método VIEWDETAIL.

 

editdetail.xsl:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="rolodex/contact">
 <html>
 <body>
 <form id="frmEditContact" name="frmEditContact" method="post">
 <xsl:attribute name="action">rolodex6.asp?mode=updatedetail&email=
 <xsl:value-of select="field[@id='email']/field_value"/></xsl:attribute>
 <h1>Edit Contact Detail</h1>
 <table border="1" cellpadding="2">
 <xsl:for-each select="field">
  <tr>
  <td>
  <xsl:value-of select="@id"/>
  </td>
  <td>
  <input type="text" size="30"> <xsl:attribute name="id"> <xsl:value-of
  select="@id" /> </xsl:attribute> <xsl:attribute
  name="name"><xsl:value-of select="@id" /></xsl:attribute>
  <xsl:attribute name="value"> <xsl:value-of select="field_value" />
  </xsl:attribute></input>
  </td>
  </tr>
 </xsl:for-each>
 </table>
 <table border="0" cellpadding="2">
 <tr>
 <td>
 <a href="java script:document.forms(0).submit();">Submit record
 update</a>
 </td>
 </tr>
 <tr>
 <td>
 <a>
 <xsl:attribute name="href">rolodex6.asp?
 mode=deletedetail&email=<xsl:value-of select="field
 [@id='email']/field_value" /></xsl:attribute>Delete this record
 </a>
 </td>
 </tr>
 <tr>
 <td>
 <a>
 <xsl:attribute name="href">rolodex6.asp</xsl:attribute>Return to
 contact list
 </a>
 </td>
 </tr>
 </table>
 </form>
 </body>
 </html>
</xsl:template>
</xsl:stylesheet>

Após as alterações necessárias a "atualização de registro Submit" link for clicado para apresentar as edições de registro. A ação do formulário é rolodex6.asp. No entanto, mode query string é agora alterado para "updatedetail". Isto diz rolodex6.asp para chamar o método updateDetail.

 

Function updateDetail(strXMLFile, strXSLFile, strEMail)


 Dim objDom
 Dim objRoot
 Dim objContact
 Dim objField
 Dim strNewEMail


 strNewEMail = Request.Form("email")


 set objXML = Server.CreateObject("Microsoft.XMLDOM")

 'Turn off asyncronous .
 objXML.async = false

 'Load XML file.
 objXML.load strXMLFile


 Set objRoot = objXML.documentElement

  Set objContact = objRoot.SelectSingleNode("contact[field/field_value='"
 & strEMail & "']")

  For each objItem in Request.Form
  Set objField = objContact.selectSingleNode("field[@id='" & objItem &
  "']/field_value")
  objField.text = Request.Form(objItem)
 Next 


 objXML.save strXMLFile


 viewDetail strXMLFile, strXSLFile, strNewEMail
End Function

Agora que temos introduzido o código necessário para editar o registro XML, permite olhar para a lógica adicional que precisa ser adicionado ao rolodex.asp. Duas demonstrações de casos novos são adicionados à instrução SELECT. Uma para mostrar o registro XML em um formulário HTML e outro para enviar as atualizações para o registro.

 

Dim strMode
Dim strEMail


strMode = Request.QueryString("mode")
strEMail = Request.QueryString("email")


Select Case strMode
 Case "viewdetail"


  viewDetail server.MapPath("rolodex6.xml"),server.MapPath
  ("viewdetail.xsl"),strEMail
 Case "editdetail"


  viewDetail server.MapPath("rolodex6.xml"), server.MapPath
  ("editdetail.xsl"), strEMail
 Case "updatedetail"

   updateDetail server.MapPath("rolodex6.xml"), server.MapPath
  ("viewdetail.xsl"), strEMail
 Case Else

 
  loadXMLFile server.MapPath("rolodex6.xml"), server.MapPath
  ("rolodex6.xsl")
End Select
%>

apagar os registros. Nós vamos adicionar um método para rolodex.asp que irá lidar com exclusão de um registro, quando o link "Delete this record" for clicado.

 

Detalhe registro Excluindo XML:

 

As folhas de estilo viewdetail.xsl e editdetail.xsl têm links que permitem que a corrente a ser excluído. Nós vamos adicionar o método Apagar a rolodex.asp a fim de executar a exclusão.

editdetail.xsl:

Function deleteDetail(strXMLFile, strXSLFile, strEMail)


 Dim objDom
 Dim objRoot
 Dim objNode


 set objXML = Server.CreateObject("Microsoft.XMLDOM")

 'Turn off asyncronous.
 objXML.async = false

 'Load XML file.
 objXML.load strXMLFile


 Set objRoot = objXML.documentElement

  Set objNode = objRoot.SelectSingleNode("contact[field/field_value='" &
 strEMail & "']")

.
 objRoot.removeChild(objNode)


 objXML.save strXMLFile


 loadXMLFile strXMLFile,strXSLFile
End Function

Precisamos fazer um additon final para a declaração Select Case para fornecer logice para exclusão de registros

<%

Dim strMode
Dim strEMail


strMode = Request.QueryString("mode")
strEMail = Request.QueryString("email")



Select Case strMode
 Case "viewdetail"

	viewDetail server.MapPath("rolodex6.xml"),server.MapPath
  ("viewdetail.xsl"),strEMail
 Case "editdetail"

	viewDetail server.MapPath("rolodex6.xml"), server.MapPath
  ("editdetail.xsl"), strEMail
 Case "updatedetail"

   updateDetail server.MapPath("rolodex6.xml"), server.MapPath
  ("viewdetail.xsl"), strEMail
 Case "deletedetail"


  deleteDetail server.MapPath("rolodex6.xml"), server.MapPath
  ("rolodex6.xsl"), strEMail
 Case Else


  loadXMLFile server.MapPath("rolodex6.xml"), server.MapPath
  ("rolodex6.xsl")
End Select
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.