-- 作者:wanghua96_1
-- 发布时间:9/7/2005 12:40:00 PM
-- [求助]在xsl:attribute中使用xsl:value-of的问题
在利用jaxp进行转换的时候遇到一个问题,有一个如下所示的xml: <users> <name choosed="true">张三</name> <name choosed="true">李四</name> <name choosed="false">王麻子</name> </users> 希望将其转化成如下所示的xhtml <!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> <title>查询结果</title> </head> <body> <span>请选择</span> <form method="post" action="training4.xhtml"> <input name="userName" type="checkbox" checked="checked" value="张三" /> 张三 <br /> <input name="userName" type="checkbox" checked="checked" value="李四" /> 李四 <br /> <input name="userName" type="checkbox" value="王麻子" /> 王麻子 <br /> <hr /> <p /> <input value="继续查找" name="isContinue" type="checkbox" /> 继续查找 <input type="text" name="Text" /> <br /> <input value="确定" name="Submit" type="submit" /> <p /> </form> </body> </html> xslt如下所示: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" indent="yes" /> <xsl:template match="/"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>查询结果</title> </head> <body> <span>请选择</span> <form action="training4.xhtml" method="post"> <xsl:if test="//isMultiChoose='true'"> <xsl:for-each select="//name"> <input type="checkbox" name="userName"> <xsl:attribute name="value"> <xsl:value-of select="self::node()" /> </xsl:attribute> <xsl:if test="self::node()[@choosed='true']"> <xsl:attribute name="checked">checked</xsl:attribute> </xsl:if> </input> <xsl:value-of select="self::node()" /> <br /> </xsl:for-each> <hr /> <p /> <input type="checkbox" name="isContinue" value="继续查找" />继续查找<input name="Text" type="text" /> <br /> </xsl:if> <xsl:if test="//isMultiChoose='false'"> <xsl:for-each select="//name"> <input type="radio" name="userName" /> <xsl:attribute name="value"> <xsl:value-of select="self::node()" /> </xsl:attribute> <xsl:value-of select="self::node()" /> <br /> </xsl:for-each> <hr /> <p /> <input type="checkbox" name="isContinue" value="重新查找" /> 重新查找 <input name="Text" type="text" /> <br /> </xsl:if> <input type="submit" name="Submit" value="确定" /> <p /> </form> </body> </html> </xsl:template> </xsl:stylesheet> 我的目的是想把用户名称作为input的value属性加进去,但是用jaxp运行的时候抛出如下错误: Exception in thread "main" javax.xml.transform.TransformerException: org.xml.sax.SAXException: Attempt to output character of integral value 29579 that is not represented in specified output encoding of . at org.apache.xalan.templates.ElemValueOf.execute(ElemValueOf.java:327) at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2362) at org.apache.xalan.transformer.TransformerImpl.transformToString(TransformerImpl.java:2045) at org.apache.xalan.templates.ElemAttribute.constructNode(ElemAttribute.java:232) at org.apache.xalan.templates.ElemElement.execute(ElemElement.java:363) at org.apache.xalan.templates.ElemAttribute.execute(ElemAttribute.java:144) at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2362) at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:716) at org.apache.xalan.templates.ElemForEach.transformSelectedNodes(ElemForEach.java:423) at org.apache.xalan.templates.ElemForEach.execute(ElemForEach.java:284) at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2362) at org.apache.xalan.templates.ElemIf.execute(ElemIf.java:199) at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2362) at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:716) at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2362) at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:716) at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2362) at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:716) at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2362) at org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2228) at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1306) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:704) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1222) at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1200) at com.holleyinfo.notesAgent.Test.main(Test.java:54) 我的java程序是: import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; public class Test { public static void main(String[] args) throws Exception { TransformerFactory factory = TransformerFactory.newInstance(); Source xmlSource = new StreamSource("SearchAgain.xml"); Source xlsSource = new StreamSource("查询结果样式表.xsl"); Transformer transformer = factory.newTransformer(xlsSource); transformer.transform(xmlSource, new StreamResult(System.out)); } } 但是如果把<xsl:attribute name="value"> <xsl:value-of select="self::node()" /> </xsl:attribute> 改为 <xsl:attribute name="value">test</xsl:attribute> 程序运行良好,所以我怀疑是不是由于相同节点名的节点数目比较多导致这个问题,因为我测试如果换成单节点就不会有问题 不知道各位大侠有没有办法解决这个问题
|