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("{http://xml.apache.org/xalan}indent-amount","0");
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
SerializationHandler serializer =
transformer.createSerializationHandler(
new StreamResult(ostream),
format);
serializer.startDocument();
transformer.executeChildTemplates(elem,
context.getContextNode(),
context.getMode(), serializer);
serializer.flushPending();
serializer.endDocument();
return ostream.toString("ISO-8859-1");
}
catch (UnsupportedEncodingException e)
{
m_Log.fatal("Error Encoding Bytes from XML - " +
e.getLocalizedMessage());
return new String();
}
}
/**
* Get the Node Value of a Stylesheet Element. This will be used to
collect
* the data value when populating a Control.....
*
* @return
*/
protected String getNodeValue( ElemExtensionCall elem )
{
Node child = elem.getFirstChild();
if (child != null)
{
return child.getNodeValue();
}
return null;
}
/**
* Resolve the Attribute Selection for the fixed attribute "select"
*
* @return
* @throws TransformerException
*/
protected String getStringValueFromSelectExpr(XSLProcessorContext
context, ElemExtensionCall elem ) throws TransformerException
{
return getStringValueFromAttribute("select", context, elem);
}
/**
* Find the Attribute named "attrib" and convert that to an XPath statement
* that can be executed.
*
* Return null if the Attribute did not exist.
*
* @param attrib
* @return
* @throws TransformerException
*/
protected static XPath getAttributeExpr( String attrib,
XSLProcessorContext context, ElemExtensionCall elem ) throws
TransformerException
{
String expr =
elem.getAttribute (attrib,
context.getContextNode(),
context.getTransformer());
if(null != expr)
{
org.apache.xpath.XPathContext xctxt
= context.getTransformer().getXPathContext();
return new XPath(
expr,
elem,
xctxt.getNamespaceContext(), XPath.SELECT);
}
return null;
}
/**
*
* Get the value of an Attribute. It will first try to treat the
attribute as an XPath
* if that fails then just return the attribute value itself.
*
* @param attrName
* @param context
* @param elem
* @return
*/
protected String getStringValueFromAttribute( String attrName,
XSLProcessorContext context, ElemExtensionCall elem )
{
XPath path;
String value = null;
try
{
path = getAttributeExpr(attrName, context, elem);
if (path != null)
{
XObject data = executeXPath(path, context, elem);
if (data != null) value = data.xstr().toString();
}
}
catch (TransformerException e)
{
value = elem.getAttribute(attrName);
}
if (value == null) value = "";
return value;
}
/**
* A helper function to execute an XPath Object.
*
* @param path
* @return
* @throws TransformerException
*/
protected static XObject executeXPath( XPath path, XSLProcessorContext
context, ElemExtensionCall elem ) throws TransformerException
{
org.apache.xpath.XPathContext xctxt
= context.getTransformer().getXPathContext();
return path.execute(xctxt, context.getContextNode(), elem);
}
protected Document getEmptyDocument()
{
initDocFactory();
return m_docBuilder.newDocument();
}
protected static void initDocFactory()
{
if (m_dfactory != null) return;
try
{
m_dfactory = DocumentBuilderFactory.newInstance();
m_docBuilder = m_dfactory.newDocumentBuilder();
}
catch (Exception e)
{
m_Log.fatal("RapidXSL Interface, failure to init XML Subsystem - "
+ e.getLocalizedMessage());
}
}
}
Cynepnaxa wrote:
> Hi, everybody!
> I start to write simple extension element, but a problem occurs. I want to
> access extension element's subelements in java+xalan. My xsl contains
> following block of code:
> <my-ext:request>
> <body><xsl:value-of select="$body"/></body>
> <contentType>text/html</contentType>
> <metaData><![CDATA[<?xml version="1.0" encoding="utf-8"?>]]><metaData>
> <xsl:value-of select="$metaData"/>
> </metaData>
> </metaData>
> </my-ext:request>
> In extension element Java-method i have "XSLProcessorContext context" and
> "ElemExtensionCall elem". I can get contentType by calling for example
> "elem.getFirstChild().getNextSibling().getFirstChild().getTextContent()",
> but i want to access subelements by tag name(for example, by
> elem.getElementsByTagName("metadata"), or XPath). I have no idea how to
> access in java content of $body variable and xml - encapsulated $metaData.
> All google - examples shining no light. Is simple xslt - subelements access
> method exist? Big thanx for help.
> P.S. Sorry for my English. I hope you understand me.
>
>
[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 哈哈的日子 阅读(353) |
评论 (0) |
编辑 收藏
要过生日了,看看老婆的准备。
早饭:
长寿面+荷包蛋 用小青菜做汤
中饭:
菜:
1可乐鸡
2鱼
3锅包肉
4黄瓜炒肉
5皮蛋
6花生
汤:蛋花汤
水果:榴莲 哈密瓜
饮料:可乐 啤酒
主食:饺子
主要地:生日蛋糕
重要的是生日礼物:
苹果笔记本电脑还有一个蓝牙的无线苹果鼠标,无比的喜欢!!!
posted @
2009-09-14 21:17 哈哈的日子 阅读(423) |
评论 (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 哈哈的日子 阅读(2291) |
评论 (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 哈哈的日子 阅读(3309) |
评论 (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 哈哈的日子 阅读(217) |
评论 (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 哈哈的日子 阅读(1727) |
评论 (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 哈哈的日子 阅读(590) |
评论 (0) |
编辑 收藏
1、我想做什么
2、我该做什么
3、我要做多久
posted @
2008-06-12 22:31 哈哈的日子 阅读(235) |
评论 (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 哈哈的日子 阅读(4792) |
评论 (0) |
编辑 收藏
batch_size 即同时提交数据的数量,原本与事务并没有什么关系,但如果涉及到同一张表数据的同一种操作,可能就会发生微妙的关系了。
场景如下:
场景一:使用 spring 控制事务,将方法事务配置为 not_supported,向同一张表中插入两条数据,保证第一条数据正常插入,而第二条数据受约束(如唯一约束)插入失败。
预测结果:第一条数据成功,第二条失败。
实际结果:两条数据均失败。
原因:hibernate 将两条插入放到了同一个 batch 中,提交同时失败了。
场景二:同样使用 spring 控制事务,将方法事务配置为 not_supported,向第一张表中插入一条合法数据,成功,向第二张表插入数据,受约束(如唯一约束)插入失败。
预测结果:第一条数据成功,第二条失败。
实际结果:第一条数据成功,第二条失败。
原因:hibernate 分别插入数据并提交,在无事务的情况下,第一条成功,第二条失败。
那么如何让场景一得到预测结果呢,一个简单的解决方法,将 hibernate.jdbc.batch_size 设置为 1,即可。
所以,即使控制了事务,也未必能够得到期望的结果,还需要考虑某些特殊的场景带来的影响。
posted @
2008-03-06 14:18 哈哈的日子 阅读(1822) |
评论 (2) |
编辑 收藏