微软专家论坛上的问题(XML)

博客围绕XML与XSLT的数据转换展开。一是探讨如何将XML中特定值填充到生成的Input里,给出了修改后的XSLT代码;二是研究能否通过XSLT将特定XML转换为脚本,介绍了使用for - each语句处理的方法,还指出XSLT用于XML到代码转换可能存在限制。

我有这样一个XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="xFormSample01.xsl"?>
<xforms>
 <model>
  <instance>
     <fname>
      Rui
     </fname>
     <lname>
      Chen
     </lname>
  </instance>

  <submission id="form1" action="submit.asp" method="get"/>
 </model>

 <input ref="fname">
  <label>First Name</label>
 </input>
 <input ref="lname">
  <label>Last Name</label>
 </input>
 <submit submission="form1">
  <label>Submit1</label>
 </submit>
</xforms>

转换的XSL是这样写的:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="
http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
   <html>
   <body>
     <h2>My Test</h2>
     <table border="0" width = "300">
     <xsl:for-each select="xforms/input">
     <tr>
       <td width = "80" border = "1"><xsl:value-of select="label"/></td>
       <td border = "1"><input type = "text" id = "{/xforms/input/label}"
value = ""/></td>
     </tr>
     </xsl:for-each>
     </table>
   </body>
   </html>
 </xsl:template>
</xsl:stylesheet>

现在的问题是,我想把XML中 xforms/model/instance 下面的值填充到生成的Input里
面,就是说
<input type = "text" id = "{/xforms/input/label}" value = ""/>里面的value如
何设置,让我
能够在生成的页面的fname和lname两个input里面分别赋予初始值Rui和Chen。谢谢!

你好,

    我们可以在<input>节点下增加一个<xsl:attribute>节点来从xml中取值赋给value属性。我对你的XSLT进行了一下修改,希望对你有帮助。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
   <html>
   <body>
     <h2>My Test</h2>
     <table border="0" width = "300">
     <xsl:for-each select="xforms/input">
     <tr>
       <td width = "80" border = "1"><xsl:value-of select="label"/></td>
       <td border = "1"><input type = "text" id = "{/xforms/input/label}">
  <xsl:variable name="x" select="@ref" />

     <xsl:attribute name="value"><xsl:value-of select="//xforms/model/instance/*[name()=$x]" /></xsl:attribute>
 </input>
 </td>
     </tr>
     </xsl:for-each>
     </table>
   </body>
   </html>
 </xsl:template>
</xsl:stylesheet>

************************************************************************************************

如果我有这样的XML:
<MENUBAR>
    <NAME>File</NAME>
    <NAME>Open</NAME>
    <NAME>Quit</NAME>
<MENUBAR>

可不可以通过XSLT转换为这样的脚本
var fileNewMenu = new Menu();
fileNewMenu.addMenu("File");
fileNewMenu.addMenu("Open");
fileNewMenu.addMenu("Quit");

就是针对每一个NAME都会对应一行fileNewMenu.addMenu的语句。

关于您提到的使用 XSLT  进行 xml 数据转换(生成 html/script)时,根据xml内容动态添加 script代码语句的问题,我们一般可以使用 for-each 语句来处理,就像一般的对于多结点产生重复输出情况一样, 比如我们有如下的 xml 文档:

<?xml version="1.0" encoding="utf-8"?>
<script>
<MENUBAR>
    <NAME>File</NAME>
    <NAME>Open</NAME>
    <NAME>Edit</NAME>
    <NAME>Quit</NAME>
</MENUBAR>
</script>


在  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" />

<xsl:template match="/" >
<html>
<head>
<title>simple xslt example</title>
<script language="javascript">
 
 function CreateMenu(txt)
 { 
  var fileNewMenu = new Menu();
  <xsl:for-each select="//NAME">
  fileNewMenu.addMenu("<xsl:value-of select="text()" />");
  </xsl:for-each>
 }
 
</script>
</head>
<body>
。。。。。。。。。。。


当然,一般来说XSLT 主要还是针对 XML数据之间的转换而设计的,不太适合作为 XML-->代码之间的转换,可能针对更复杂的情况会有限制。 以上是我的一些建议,希望有所帮助。

*******************************************************************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值