用XSLT樣式表加工後的XML顯示DBF文件內容

1.程序需求javascript

在NAS上(能夠理解爲局域網上一個存放了若干文件的IP地址),有若干個DBF文件,它們佔用的空間都不大。如今要作一個功能,就是把這些文件每隔一段時間,作一個快照,以XML形式保存DBF文件的值。並把XML文檔保存到指定位置,用已經寫好的XSLT樣式表,來顯示這個XML文件,並提供一些XML文件的統計信息。css

2.個人架構html

DbfMonitor(程序根目錄)
|
|-dbfs(目錄)
| |
| |-dbf1(目錄)
| | |-dbf1.dbf
| |-dbf2(目錄)
| | |-dbf2.dbf
| ...
|
|-xmls(目錄)
| |
| |-xml1(目錄)
| | |-xml1.xml
| | |-xml1.xslt
| | |-xml1.css(xslt文件調用)
| |-xml2(目錄)
| | |-xml2.xml
| | |-xml2.xslt
| | |-xml2.css(xslt文件調用)
| ...
|
|-Dbf2Xml.exe(一個VB.NET程序,將DBF轉換到XML)
|-DbfMonitor.bat(單擊這個文件運行程序)
|-DbfMonitor.vbs

關於這個程序結構樹的說明以下:java

1)雙擊DbfMonitor.bat文件,啓動這個程序,DbfMonitor.bat會調用文件DbfMonitor.vbsapi

2)DbfMonitor.vbs有兩個功能:其一爲每隔一段時間,將NAS上(或其餘任意Windows文件系統可訪問到的位置)的DBF文件,同步到本地dbfs目錄下;其二爲調用程序Dbf2Xml,把DBF文件的內容寫到指定的XML文件中,保存到xmls目錄下對應的目錄中瀏覽器

3)生成XML文件,會引用與之同名的*.xslt文件做爲樣式表,*.xslt中帶有javascript代碼,保證每隔一段時間XML文件會刷新一次,用來保證查看到的是最新的DBF文件內容,*.xslt文件還會調用同名的css樣式表,用來保證一些界面的美觀安全

3.部分程序代碼網絡

1)DbfMonitor.bat架構

這個文件用來調用DbfMonitor.vbs,代碼以下:工具

@cscript DbfMonitor.vbs
@pause

2)DbfMonitor.vbs

下面的程序,以同步一個A.DBF到A.XML爲例:

Option Explicit

WScript.Echo "DBF同步顯示工具 2015年2月 Tsybius"
WScript.Echo "--------------------------------"

Dim FSO : Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Dim WS : Set WS = WScript.CreateObject("WScript.Shell")

'這裏設定時間間隔信息
Const Interval = 10000

Dim CurHour 
Dim CurMinute 
Dim CurSecond 

Do

    '打印時間信息
    CurHour = Hour(Now)
    CurMinute = Minute(Now)
    CurSecond = Second(Now)

    WScript.Echo "當前時間: " & CurHour & "時 " & CurMinute & "分 " & CurSecond & "秒"

    'A.DBF
    WScript.Echo "複製文件A.DBF"
    If FSO.FileExists("P:\A.DBF") Then
        FSO.CopyFile "P:\A.DBF", "dbfs\dbf_A\A.dbf", True
        WScript.Echo "A.DBF文件複製完畢: dbfs\dbf_A\A.dbf"
        WS.Run "Dbf2Xml.exe dbfs\dbf_A\A.dbf xmls\xml_A\A.xml A MS_VFP_Oledb", 0
    Else 
        WScript.Echo "未找到A.DBF"
    End If

    WScript.Sleep(Interval)

Loop

3)Dbf2Xml.exe

這是一個用VB.NET語言寫的DBF轉XML工具

它能夠把DBF轉換成下面形式的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='A.xslt'?>
<DATA COUNT="32" INPUT-DBF="A.dbf" OUTPUT-XML="A.xml">
  <DATA_ROW>
    <列1>列1內容</列1>
    <列2>列2內容</列2>
    列三、列4 ...
  </DATA_ROW>
  <DATA_ROW>
    <列1>列1內容</列1>
    <列2>列2內容</列2>
    列三、列4 ...
  </DATA_ROW>
  行三、行4 ...
</DATA>

這個程序是在一個另外一個程序的基礎上改寫的:http://www.oschina.net/p/curtia_dbf2xml

共有4個參數,分別是DBF文件地址、轉換後的XML文件地址、針對該XML轉換須要添加的參數(這個參數是在程序中根據實際狀況進行改動的)、鏈接DBF文件使用的鏈接方式(有多種鏈接方式時能夠配置它)

4)關於xslt文件

對於每個XML,都要有一個本身專屬的XSLT文件與之匹配,這樣才能讓XML文件顯示出想要的東西

下面是一個XML文件示例:A.xml

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='A.xslt'?>
<DATA COUNT="3" INPUT-DBF="A.dbf" OUTPUT-XML="A.xml">
  <DATA_ROW>
    <COLUMN1>A</COLUMN1>
    <COLUMN2>1</COLUMN2>
    <COLUMN3>1</COLUMN3>
    <COLUMN4>1</COLUMN4>
    <COLUMN5>1</COLUMN5>
    <COLUMN6>1</COLUMN6>
    <COLUMN7>1</COLUMN7>
  </DATA_ROW>
  <DATA_ROW>
    <COLUMN1>B</COLUMN1>
    <COLUMN2>3</COLUMN2>
    <COLUMN3>3</COLUMN3>
    <COLUMN4>3</COLUMN4>
    <COLUMN5>3</COLUMN5>
    <COLUMN6>3</COLUMN6>
    <COLUMN7>3</COLUMN7>
  </DATA_ROW>
  <DATA_ROW>
    <COLUMN1>C</COLUMN1>
    <COLUMN2>2</COLUMN2>
    <COLUMN3>2</COLUMN3>
    <COLUMN4>2</COLUMN4>
    <COLUMN5>2</COLUMN5>
    <COLUMN6>2</COLUMN6>
    <COLUMN7>2</COLUMN7>
  </DATA_ROW>
</DATA>

它對應的XSLT文件的示例爲:A.xslt

<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="html"/>
  
  <xsl:template match="/">
    <html>
      <head>        
        <meta content="zh-cn" http-equiv="Content-Language"/>
        <meta content="text/html; charset=utf-16" http-equiv="Content-Type"/>
        <link type="text/css" rel="stylesheet" href="A.css"/>
        <title>標題</title>
        
        <script type="text/javascript" language="javascript">
          <xsl:text disable-output-escaping="yes">
          <![CDATA[
          
            function myrefresh()
            {
                window.location.reload();
            }
            setTimeout('myrefresh()', 300000); //在這裏指定刷新間隔,單位毫秒
          
          ]]>
        </xsl:text>
        </script>
      </head>
      <body>
        
        <div id="content">
        
          <br />
          數據總計: <strong><font color="red"><xsl:value-of select="DATA/@COUNT" /></font></strong><br />
          輸入文件: <strong><font color="red"><xsl:value-of select="DATA/@INPUT-DBF" /></font></strong><br />
          輸出文件: <strong><font color="red"><xsl:value-of select="DATA/@OUTPUT-XML" /></font></strong><br />
          
          <hr />
          
          <xsl:variable name="A_1" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='1'])"/>
          <xsl:variable name="A_2" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='2'])"/>
          <xsl:variable name="A_3" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='3'])"/>
          <xsl:variable name="A_4" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='4'])"/>
          <xsl:variable name="A_5" select="count(DATA/DATA_ROW[COLUMN1='A' and COLUMN2='5'])"/>
          
          <xsl:variable name="B_1" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='1'])"/>
          <xsl:variable name="B_2" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='2'])"/>
          <xsl:variable name="B_3" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='3'])"/>
          <xsl:variable name="B_4" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='4'])"/>
          <xsl:variable name="B_5" select="count(DATA/DATA_ROW[COLUMN1='B' and COLUMN2='5'])"/>
          
          <xsl:variable name="C_1" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='1'])"/>
          <xsl:variable name="C_2" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='2'])"/>
          <xsl:variable name="C_3" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='3'])"/>
          <xsl:variable name="C_4" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='4'])"/>
          <xsl:variable name="C_5" select="count(DATA/DATA_ROW[COLUMN1='C' and COLUMN2='5'])"/>
          
          統計信息:<br />
          <table>
          
            <tr>
              <th></th>
              <th>1</th>
              <th>2</th>
              <th>3</th>
              <th>4</th>
              <th>5</th>
            </tr>
            
            <tr>
              <td>A</td>
              <td><xsl:value-of select="$A_1"/></td>
              <td><xsl:value-of select="$A_2"/></td>
              <td><xsl:value-of select="$A_3"/></td>
              <td><xsl:value-of select="$A_4"/></td>
              <td><xsl:value-of select="$A_5"/></td>
            </tr>
            
            <tr>
              <td>B+C</td>
              <td><xsl:value-of select="$B_1+$C_1"/></td>
              <td><xsl:value-of select="$B_2+$C_2"/></td>
              <td><xsl:value-of select="$B_3+$C_3"/></td>
              <td><xsl:value-of select="$B_4+$C_4"/></td>
              <td><xsl:value-of select="$B_5+$C_5"/></td>
            </tr>
            
          </table>
          
          <hr />
          
          <table>
            <tr>
              <th>列1</th>
              <th>列2</th>
              <th>列3</th>
              <th>列4</th>
              <th>列5</th>
              <th>列6</th>
              <th>列7</th>
            </tr>
            <xsl:for-each select="DATA/DATA_ROW">
              <tr>
                <td class="textCentered"><xsl:value-of select="COLUMN1"/></td>
                <td class="textCentered"><xsl:value-of select="COLUMN2"/></td>
                <td class="textCentered"><xsl:value-of select="COLUMN3"/></td>
                <td class="textCentered"><xsl:value-of select="COLUMN4"/></td>
                <td class="textCentered"><xsl:value-of select="COLUMN5"/></td>
                <td class="textCentered"><xsl:value-of select="COLUMN6"/></td>
                <td class="textCentered"><xsl:value-of select="COLUMN7"/></td>
              </tr>
            </xsl:for-each>
          </table>
        </div>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

調用的CSS文件爲:A.css

/* Body style, for the entire document */
body
{
    background: #F3F3F4;
    color: #1E1E1F;
    font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    padding: 0;
    margin: 0;
}
 
/* Header1 style, used for the main title */
h1
{
    padding: 10px 0px 10px 10px;
    font-size: 21pt;
    background-color: #E2E2E2;
    border-bottom: 1px #C1C1C2 solid; 
    color: #201F20;
    margin: 0;
    font-weight: normal;
}
 
/* Table styles */ 
table
{
    border-spacing: 0 0;
    border-collapse: collapse;
    font-size: 10pt;
}
 
table th
{
    background: #3399FF;
    text-align: center;
    text-decoration: none;
    font-weight: normal;
    padding: 3px 6px 3px 6px;
    width:100px;
}
 
table td
{
    vertical-align: top;
    text-align: center;
    padding: 3px 6px 5px 5px;
    margin: 0px;
    border: 1px solid #E7E7E8;
    background: #66FF33;
}
 
.textCentered
{
    text-align: center;
}
 
#content 
{
    padding: 0px 12px 40px 40px; 
}

最終A.xml打開後的效果爲:

4.其餘注意事項

1)IE瀏覽器在加載XML時,會提示「爲了有利於保護安全性,Internet Explorer已限制此網頁運行能夠訪問計算機的腳本或ActiveX控件。請單擊這裏獲取選項...」,在鼠標右鍵彈出的菜單中選擇「容許阻止的內容」,便可調用javascript代碼不斷刷新頁面

2)Windows的文件系統沒法直接經過IP地址獲取NAS上的文件,必需要對網絡驅動器作完映射後才能經過新賦予的盤符訪問NAS上的路徑,方法是在桌面上的計算機圖標上,單擊鼠標右鍵→映射網絡驅動器。若是不進行驅動器映射,在訪問時會報錯,好比在cmd中使用cd命令訪問路徑「\\IP地址\目錄名\」,會提示「CMD不支持將UNC路徑做爲當前目錄」

3)若是不當心直接點擊了*.vbs文件,要關閉它,須要先按下「Ctrl+Alt+Delete」,進入Windows 任務管理器,在進程選項卡中關閉進程wscript.exe

END

相關文章
相關標籤/搜索