xsl 里增加
function valueOf(context, elem) {
return tools.valueOf(context, elem);
}
代碼里增加
public String valueOf(XSLProcessorContext context, ElemExtensionCall elem) {
String value = elem.getAttribute("select");
String maxStr = elem.getAttribute("max");
try {
value = executeExpression(context, elem, value);
} catch (TransformerException e) {
}
if (isNotBlank(maxStr)) {
try {
int max = Integer.parseInt(maxStr);
value = shortStr(value, max);
} finally {
}
}
return value;
}
private String executeExpression(XSLProcessorContext context, ElemExtensionCall elem, String value)
throws TransformerException {
XPathContext xctxt = context.getTransformer().getXPathContext();
XPath path = new XPath(value, elem, xctxt.getNamespaceContext(), XPath.SELECT);
XObject data = path.execute(xctxt, context.getContextNode(), elem);
if (data != null)
value = data.xstr().toString();
return value == null ? "" : value;
}
參考了下面的文檔
[prev in list] [next in list] [prev in thread] [next in thread]
List: xalan-j-users
Subject: Re: Extension element with subelements
From: John Gentilin <gentijo () eyecatching ! com>
Date: 2007-09-07 21:48:37
Message-ID: 46E1C735.2080504 () eyecatching ! com
[Download message RAW]
Oops... this might be what you are after instead...
executeChildTemplatesToXML or ToString or ToXMLString
may be what you are after..
/**
* A repository for common functions that can be used but the extension
* functions and extension elements.
*
*
* Title: Base Functions
* Copyright: Copyright (c) 2005
* Company: Eye Catching Solutions Inc.
* @version 1.0
* @author John Gentilin
*/
public class BaseFunctions
{
private static Category m_Log =
Category.getInstance("RapidXSL.Interface");
private static DocumentBuilderFactory m_dfactory = null;
private static DocumentBuilder m_docBuilder = null;
/**
* @param context
* @param elem
* @throws TransformerException
*/
protected void executeChildTemplates( XSLProcessorContext context,
ElemExtensionCall elem ) throws TransformerException
{
TransformerImpl transf = context.getTransformer();
transf.executeChildTemplates(elem,
context.getContextNode(),
context.getMode(), transf.getResultTreeHandler());
}
/**
* @param context
* @param elem
* @throws TransformerException
*/
protected Document executeChildTemplatesToXML(Document doc,
XSLProcessorContext context, ElemExtensionCall elem ) throws
XMLServerException
{
DOMBuilder builder = null;
TransformerImpl transformer = context.getTransformer();
try
{
builder = new DOMBuilder(doc);
transformer.executeChildTemplates(elem,
context.getContextNode(),
context.getMode(), builder);
}
catch (Exception e)
{
throw new XMLServerException("RXSL_IFACE", "XSL Interface Error -
" + e.getLocalizedMessage());
}
return doc;
}
/**
* @param context
* @param elem
* @throws TransformerException
*/
protected String executeChildTemplatesToString(XSLProcessorContext
context, ElemExtensionCall elem ) throws XMLServerException
{
TransformerImpl transformer = context.getTransformer();
try
{
TextSerializationHandler handler = new TextSerializationHandler();
transformer.executeChildTemplates(elem,
context.getContextNode(),
context.getMode(), handler);
return handler.toString();
}
catch (Exception e)
{
throw new XMLServerException("RXSL_IFACE", "XSL Interface Error -
" + e.getLocalizedMessage());
}
}
protected String executeChildTemplatestoXMLString(XSLProcessorContext
context, ElemExtensionCall elem)
throws TransformerException, SAXException
{
try
{
TransformerImpl transformer = context.getTransformer();
// This should be worked on so that the output format can be
// defined by a first child of the redirect element.
OutputProperties format = transformer.getOutputFormat();
Properties prop = format.getProperties();
format.setProperty("indent","no");
format.setProperty("{[prev in list] [next in list] [prev in thread] [next in thread]
Configure | About | News | Donate | Add a list | Sponsors: 10East, KoreLogic, Terra-International, Chakpak.com
posted @
2009-10-21 17:19 哈哈的日子 閱讀(356) |
評論 (0) |
編輯 收藏
要過生日了,看看老婆的準備。
早飯:
長壽面+荷包蛋 用小青菜做湯
中飯:
菜:
1可樂雞
2魚
3鍋包肉
4黃瓜炒肉
5皮蛋
6花生
湯:蛋花湯
水果:榴蓮 哈密瓜
飲料:可樂 啤酒
主食:餃子
主要地:生日蛋糕
重要的是生日禮物:
蘋果筆記本電腦還有一個藍牙的無線蘋果鼠標,無比的喜歡!!!
posted @
2009-09-14 21:17 哈哈的日子 閱讀(426) |
評論 (3) |
編輯 收藏
1. 先到 google code 上下載了 api 的 lib,當然是 java client,還有好多,比如 .net , php 什么的,沒看。
2. 去看 google data api 的 getting start,但是,那個 ant 命令執行完,會出一些 captcha 的錯誤,沒細看,估計是需要驗證碼了,api 沒跟上。
3. 直接到 calendar 里面,把 CalendarFeedDemo執行了一下,注意,需要輸入用戶名和密碼,用戶名是 aaa@gmail.com 這樣的,但發現這個不是我要的,我要的只是增加個 event 而已。
4. 執行 EventFeedDemo,jump這個才是我要的,簡化了一下,只要能增加一個定時的 event,并有提醒,就夠了。
代碼在下面,連包名都沒改:
1
2 package sample.calendar;
3
4 import java.io.IOException;
5 import java.net.URL;
6 import java.util.Calendar;
7 import java.util.GregorianCalendar;
8 import java.util.TimeZone;
9
10 import com.google.gdata.client.calendar.CalendarService;
11 import com.google.gdata.data.DateTime;
12 import com.google.gdata.data.PlainTextConstruct;
13 import com.google.gdata.data.calendar.CalendarEventEntry;
14 import com.google.gdata.data.extensions.Reminder;
15 import com.google.gdata.data.extensions.When;
16 import com.google.gdata.data.extensions.Reminder.Method;
17 import com.google.gdata.util.ServiceException;
18
19 public class HahaCalendar {
20 private static URL eventFeedUrl;
21 private static final String METAFEED_URL_BASE = "http://www.google.com/calendar/feeds/";
22 private static final String EVENT_FEED_URL_SUFFIX = "/private/full";
23
24 public static void main(String[] args) throws ServiceException, IOException {
25 String username = "username@gmail.com";
26 eventFeedUrl = new URL(METAFEED_URL_BASE + username + EVENT_FEED_URL_SUFFIX);
27 CalendarService myService = new CalendarService("haha calendar");
28 myService.setUserCredentials(username, "password");
29 CalendarEventEntry singleEvent = createSingleEvent(myService, "每天背單詞", "單詞1,單詞2");
30 System.out.println("Successfully created event " + singleEvent.getTitle().getPlainText());
31 }
32
33 private static CalendarEventEntry createSingleEvent(CalendarService service, String eventTitle, String eventContent)
34 throws ServiceException, IOException {
35 CalendarEventEntry entry = new CalendarEventEntry();
36 entry.setTitle(new PlainTextConstruct(eventTitle));
37 entry.setContent(new PlainTextConstruct(eventContent));
38 Calendar calendar = new GregorianCalendar();
39 calendar.add(Calendar.MINUTE, 10);
40 DateTime startTime = new DateTime(calendar.getTime(), TimeZone.getDefault());
41 calendar.add(Calendar.MINUTE, 60);
42 DateTime endTime = new DateTime(calendar.getTime(), TimeZone.getDefault());
43 When eventTimes = new When();
44 eventTimes.setStartTime(startTime);
45 eventTimes.setEndTime(endTime);
46 entry.addTime(eventTimes);
47 addReminder(entry);
48 return service.insert(eventFeedUrl, entry);
49 }
50
51 private static void addReminder(CalendarEventEntry myEntry) {
52 Reminder reminder = new Reminder();
53 reminder.setMinutes(5);
54 reminder.setMethod(Method.SMS);
55 myEntry.getReminder().add(reminder);
56 }
57 }
58
想用的注意,把上面的用戶名和密碼改成自己的。
posted @
2009-07-19 13:04 哈哈的日子 閱讀(2301) |
評論 (4) |
編輯 收藏
1. 先到 oracle 網站上下載了 oracle 11g for linux 的 zip 包,并解壓
2. 在用戶下執行 ./runInstaller -jreLoc /usr/lib/jvm/java-6-sun/jre/(我指定了使用我安裝的jdk,否則會中文亂碼)
待續……
3. 一路下一步就可以了,但其中有一些依賴的東西需要先安裝好,有
a) libaio1
b) rpm
c) ksh
4. 要把一些命令 link 到 /usr/bin 目錄下,其中 有
a) awk -> /etc/alternatives/awk
b) ksh -> /etc/alternatives/usr.bin.ksh
5. 還要把一個必須的目錄建出來,就是 /opt,其實這個目錄有可能已經存在了的。
6. 然后就一切 ok 了,但要啟動 oracle 還需要增加一些環境變量,我一般就把這些放在 .bashrc 里了。
a) export ORACLE_HOME=/home/haha/app/haha/product/11.1.0/db_1
b) export ORACLE_SID=haha
c) export NLS_LANG=american_america.utf8(這個是為了顯示中文內容的時候不會亂碼)
d) export PATH=$PATH:/home/haha/app/haha/product/11.1.0/db_1/bin(這個就是為了方便,不設也行)
7. 測試安裝是否成功,可以從下面的幾個方面看
a) 訪問 https://domain:1158/em,看看能登錄不。
b) netstat -anop | grep 1521,看看 listener 啟動沒有
下次再啟動 oracle 需要使用下面的命令
a) 啟動數據庫實例: sqlplus "/as sysdba",然后 startup
b) 啟動 listener:lsnrctl start
c) 啟動 em:emctl start dbconsole(可選)
linux oracle 客戶端可以使用 sql developer,在 oracle 網站上就能下載,其實這是無奈之舉,畢竟 plsqldev 無法在 linux 下使用。
posted @
2009-07-12 18:23 哈哈的日子 閱讀(3316) |
評論 (5) |
編輯 收藏
找到一篇非常不錯的文章,晚上回來操作一下。
http://zeroliu.blogdriver.com/zeroliu/1208212.html
應用場景:
玩個游戲文字mud,客戶端使用mushclient,支持使用 lua 腳本來寫 robot,以便自動練功。
但由于多個 id 之間 share 數據比較困難,導致地圖數據在每個 id 都要加載一次,數量大了之后,內存用很多,而且還會出現莫明其妙的內存泄漏問題。所以想改用 java 實現(因為我不會用 c 實現)
最終選擇了使用 lua 調用 c,然后調用 java
posted @
2008-10-19 09:49 哈哈的日子 閱讀(221) |
評論 (0) |
編輯 收藏
安裝了cdt 5.0,以前可以build的project死都不能build。
錯誤是
**** Internal Builder is used for build ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\Test.o ..\src\Test.cpp
Internal Builder: Cannot run program "g++": ??Õ?»µ½?¶¨µ
Build error occurred, build is stopped
Time consumed: 0 ms.
把 MinGW 的運行目錄加到classpath里,把mingw32-make.exe復制一個,改名為make.exe。
在命令行下,一切都沒有問題,就是在 eclipse里面不能用,郁悶了幾天了。
google 了一下,參考了
http://www.eclipseworld.org/bbs/read-cec-tid-18540-page-e.html
這個帖子中參考了
http://74.53.91.20/bbs/read-cec-tid-17557-fpage-2.html
最終的方法是將
org.eclipse.cdt.core.win32_5.0.0.200809120802.jar
解壓成目錄org.eclipse.cdt.core.win32_5.0.0.200809120802,注意把原來的jar刪除。
要人命了,這也能行,不看 code 估計這輩子都解決不了這個問題了。
posted @
2008-10-18 20:36 哈哈的日子 閱讀(1733) |
評論 (4) |
編輯 收藏
今天安裝了 svn 服務端。
為什么寫呢?因為和以前安裝的不一樣。
有什么不一樣呢?
1、方便了很多
2、安裝了 viewvc
為什么要安裝 viewvc,而不是fisheye呢?
不是因為viewvc比fisheye好,就是因為剛才的第一點,方便。
以前安裝 svn 都是直接下載一個 svn windows 版的壓縮包,解壓,bin目錄加到path里,使用 sc 命令用 svnserve 建個服務,啟動,完成。
其實這個步驟還是很簡單的,就是在使用 sc 建 service 的時候,命令行有些復雜而已。
但這樣只能使用 svn://xxx/xxx 來使用,而且不能在 web 上看到版本庫,那么,就想了點兒辦法,安裝一個 apache 吧,然后根據文檔,一頓猛配,相當的麻煩。好處就是,可以使用
http://xxx/xxx 來使用,而且可以在 web 上瀏覽到最新的版本內容,雖然 web 功能土了點兒,但至少可以使用了。有的時候,深得這樣不爽,就再加個 fisheye,我個人相當喜歡 fisheye 這個軟件,以至于花了點兒時間破解了一下,需要的可以在 blog 上找一下,不是暴力的那種,是半注冊的,可以跟著升級的那種。
但是,唯一,也是最大的問題,就是麻煩,安裝這一套東西,那是相當的麻煩啊。
今天發現了一個方便的辦法。
下載三個東西:
1、CollabNet Subversion Server
2、python
3、python win32api
安裝過程和下載不太一樣。
1、python
2、CollabNet Subversion Server
3、python win32api
2、3順序無所謂的。
然后,就擁有了一個 svn + apache + viewvc 的環境了,相當的方便。
我喜歡。
呵呵…… ^_^
posted @
2008-08-05 21:28 哈哈的日子 閱讀(599) |
評論 (0) |
編輯 收藏
1、我想做什么
2、我該做什么
3、我要做多久
posted @
2008-06-12 22:31 哈哈的日子 閱讀(237) |
評論 (0) |
編輯 收藏
可以直接將 plugin 放到 dropins 目錄下,即可自動完成安裝。
dropins 目錄支持下列形式的結構。
1、
eclipse/
dropins/
org.eclipse.core.tools_1.4.0.200710121455.jar
org.eclipse.releng.tools_3.3.0.v20070412/
plugin.xml
tools.jar
... etc ...
...
2、
eclipse/
dropins/
eclipse/
features/
plugins/
3、
eclipse/
dropins/
emf/
eclipse/
features/
plugins/
gef/
eclipse/
features/
plugins/
... etc ...
4、
eclipse/
dropins/
emf.link
最后一種就相當原來的 links 目錄,只要寫
path = ...
就可以了。
posted @
2008-04-13 13:02 哈哈的日子 閱讀(4798) |
評論 (0) |
編輯 收藏
batch_size 即同時提交數據的數量,原本與事務并沒有什么關系,但如果涉及到同一張表數據的同一種操作,可能就會發生微妙的關系了。
場景如下:
場景一:使用 spring 控制事務,將方法事務配置為 not_supported,向同一張表中插入兩條數據,保證第一條數據正常插入,而第二條數據受約束(如唯一約束)插入失敗。
預測結果:第一條數據成功,第二條失敗。
實際結果:兩條數據均失敗。
原因:hibernate 將兩條插入放到了同一個 batch 中,提交同時失敗了。
場景二:同樣使用 spring 控制事務,將方法事務配置為 not_supported,向第一張表中插入一條合法數據,成功,向第二張表插入數據,受約束(如唯一約束)插入失敗。
預測結果:第一條數據成功,第二條失敗。
實際結果:第一條數據成功,第二條失敗。
原因:hibernate 分別插入數據并提交,在無事務的情況下,第一條成功,第二條失敗。
那么如何讓場景一得到預測結果呢,一個簡單的解決方法,將 hibernate.jdbc.batch_size 設置為 1,即可。
所以,即使控制了事務,也未必能夠得到期望的結果,還需要考慮某些特殊的場景帶來的影響。
posted @
2008-03-06 14:18 哈哈的日子 閱讀(1830) |
評論 (2) |
編輯 收藏