XML形式で保存した掲示の表示

xml形式で保存した掲示をXSLTを使って入力画面の下に表示する。

このとき、削除機能を追加するためのボタンを設けるが
asp.net内で処理できないため、同じ名前でasp.netで削除ボタンを追加する。
追加したボタンは、display:noneで表示しないようにした。

Filename: bbs.aspx

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="bbs.aspx.vb" Inherits="WebApplication1.bbs" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>みんなの掲示板</title>
    <link rel="Stylesheet" type="text/css" href="main.css" />
    <style type="text/css">
        .style1
        {
            width: 115px;
        }
        .hidden 
        {
            display:none;
    </style>
</head>
<body>
<h1>みんなの掲示板</h1>
    <form id="form1" runat="server">
    <div>
    
        <table id="content" >
            <tr>
                <td class="style1">
                    名前</td>
                <td>
                    <asp:TextBox ID="Name" runat="server" Width="307px"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style1">
                    題名</td>
                <td>
                    <asp:TextBox ID="Subject" runat="server" Width="466px"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style1">
                    本文</td>
                <td>
                    <asp:TextBox ID="Body" runat="server" Height="105px" TextMode="MultiLine" 
                        Width="465px"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style1">
                    &nbsp;</td>
                <td>
                    削除キー<asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox>
                    <asp:Button ID="Submit" runat="server" Text="投稿" Width="67px" />
                    &nbsp;
                    <input id="Reset1" type="reset" value="リセット" /></td>
            </tr>
        </table>
     <asp:Xml ID="Xml1" runat="server" DocumentSource="~/xmlfile.xml" 
        TransformSource="~/xsltfile.xslt"></asp:Xml>
    
    </div>
    </form>
   
</body>
</html>

Filename: bbs.aspx.vb

Imports System.Xml
Imports System.Xml.Xsl
Imports System.IO

Partial Public Class bbs
    Inherits System.Web.UI.Page
    Private xmlFilePath As String
    Private xmlDoc As XmlDocument
    Private xmlRoot As XmlElement
    Private xmlEle As XmlElement
    Private xmlNode As XmlElement
    Private xmlText As XmlText
    Protected WithEvents Del As Global.System.Web.UI.WebControls.Button
    Private Sub bbs_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    End Sub

    Protected Sub Delt_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Del.Click
        Dim obj As Button
        obj = CType(sender, Button)
        Name.Text = obj.Text
        Body.Text = Password.Text
        Dim a As String
        a = Request("password" & obj.Text)
        Subject.Text = Val(a)
    End Sub

    Protected Sub Submit_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Submit.Click
        ' nodeの作成
        xmlNode = xmlDoc.CreateElement("node")
        ' nodeに追加
        Append("name", Name.Text)
        Append("subject", Subject.Text)
        Append("body", Body.Text)
        Append("password", Password.Text)
        Append("date", Now)
        'id +1
        Dim nodes As XmlNodeList
        Dim n As Integer
        nodes = xmlDoc.DocumentElement.SelectNodes("//id")
        n = nodes.Count
        If n = 0 Then
            n = 1
        Else
            n = Val(nodes.Item(n - 1).InnerText) + 1
        End If
        Append("id", n)
        'rootに追加
        xmlRoot.AppendChild(xmlNode)
        '保存
        xmlDoc.Save(xmlFilePath)

        'XSLTによる表示
        Dim xslt As XslCompiledTransform = New XslCompiledTransform
        xslt.Load(Page.Server.MapPath("xsltfile.xslt"))

    End Sub
    Private Sub Append(ByVal Tag As String, ByVal Param As String)
        ' <tag>題名</tag>
        xmlText = xmlDoc.CreateTextNode(Param)
        xmlEle = xmlDoc.CreateElement(Tag)
        xmlEle.AppendChild(xmlText)
        ' nodeにtagを追加
        xmlNode.AppendChild(xmlEle)
    End Sub


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        ' Web.Configからファイル名を取得
        xmlFilePath = System.Configuration.ConfigurationManager.AppSettings("xmlfile")
        ' フルパスに変更 xmlfile.xml --> C:\Users\・・・\xmlfile.xml
        xmlFilePath = Page.Server.MapPath(xmlFilePath)
        xmlDoc = New XmlDocument
        ' FIleInfoは、ファイル情報を調べる
        Dim fs As New System.IO.FileInfo(xmlFilePath)
        If fs.Exists Then
            'ファイルが存在する
            xmlDoc.Load(xmlFilePath)
        Else
            'ファイルが存在しない
            xmlDoc.LoadXml("<?xml version=""1.0"" encoding=""utf-8"" ?><root/>")
        End If
        xmlRoot = xmlDoc.DocumentElement
        '保存
        xmlDoc.Save(xmlFilePath)

        '削除ボタン生成とボタンの非表示処理
        Dim nodes As XmlNodeList
        Dim n As Integer
        nodes = xmlDoc.DocumentElement.SelectNodes("//id")
        n = nodes.Count
        If n > 0 Then
            n = Val(nodes.Item(n - 1).InnerText)
            For i As Integer = 1 To n
                Del = New Button
                Del.ID = "delete" & i
                Del.Text = i
                Del.CssClass = "hidden"
                AddHandler Del.Click, AddressOf Delt_Click
                form1.Controls.Add(Del)
            Next
        End If

    End Sub
End Class

Filename: xsltfile.xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/TR/xhtml1/strict"
>
    <xsl:output method="xml" />
  <xsl:template match="/">
    <xsl:for-each select="root/node">
        <xsl:sort select="date" order="descending" />
          <table class="message">
            <tr>
              <td>
                <xsl:value-of select="name"/>
              </td>
              <td>
                <xsl:value-of select="date"/>
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <xsl:value-of select="subject"/>
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <xsl:value-of select="body"/>
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <xsl:element name="input">
                  <xsl:attribute name="type">password</xsl:attribute>
                  <xsl:attribute name="name">password<xsl:value-of select="id"/></xsl:attribute>
                </xsl:element>
                <xsl:element name="input">
                  <xsl:attribute name="type">submit</xsl:attribute>
                  <xsl:attribute name="name">delete<xsl:value-of select="id"/></xsl:attribute>
                  <xsl:attribute name="value">削除</xsl:attribute>
                </xsl:element>
              </td>
            </tr>
          </table>
      </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>