以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 XSL/XSLT/XSL-FO/CSS 』  (http://bbs.xml.org.cn/list.asp?boardid=8)
----  [求助]在xsl:attribute中使用xsl:value-of的问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=21970)


--  作者: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>
程序运行良好,所以我怀疑是不是由于相同节点名的节点数目比较多导致这个问题,因为我测试如果换成单节点就不会有问题

不知道各位大侠有没有办法解决这个问题


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms