前段时间写了个邮件xml的xsl

来源:互联网 发布:2016年网络病毒 编辑:程序博客网 时间:2024/05/10 23:28

前段时间给个客户写了个信封xml的xsl。在一个信封当中,邮政编码是分别显示在一个一个的格子当中的,因此具体实现上需要把邮政编码字符串分别填写到table 的td中,它的解析template如下:

<!-- ********************  显示邮政编码到一个有边框的Table中 ******************** -->
<xsl:template match="邮编">
 <table width="150" border="0" cellpadding="2" cellspacing="0" class="Postalcode">
  <tr>
 <!-- 把邮政编码字符串从头到尾遍历一遍,每个号码放到一个td中 -->
   <xsl:call-template name="eachPostalCodeNum">
    <xsl:with-param name="CodePositon" select="1"/> 
    <xsl:with-param name="PostalCodeStr" select="string(.)"/> 
   </xsl:call-template>
  </tr>
 </table>
</xsl:template>

<!-- ********* 遍历邮政编码的一个Template,参数CodePosition是当前字符位置,参数PostalCodeStr是字符串参数,通过递归方式调用自身来循环字符串 ************* -->
<xsl:template name="eachPostalCodeNum">
 <xsl:param name="CodePositon"/>
 <xsl:param name="PostalCodeStr"/>
 <xsl:variable name="CodeLen" select="string-length($PostalCodeStr)"/>
 
 <td class="Postalcode"><xsl:value-of select="substring($PostalCodeStr,$CodePositon,1)"/></td>
 <xsl:if test="$CodePositon &lt; $CodeLen">
  <xsl:call-template name="eachPostalCodeNum">
   <xsl:with-param name="CodePositon" select="$CodePositon + 1"/> 
   <xsl:with-param name="PostalCodeStr" select="$PostalCodeStr"/> 
  </xsl:call-template>
 </xsl:if>
</xsl:template>

由于xsl中的变量一旦被定义了,在同一个作用域里就不能被重新定义了,因此要在xsl/xslt中作类似于for(int i=1;i<max;i++){...}类似的循环就无法实现,但是可以用调用自身的方法了实现这种有变量增减的循环。

 

 

完整的xml和xsl如下:

<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<html xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<title>信封</title>
<style type="text/css">
 v/:* {
 BEHAVIOR: url(#default#VML)
}
table {
 font-family: "宋体";
 font-size: 14px;
}
table.Postalcode {
 border-top: 1px solid #990000;
 border-right: 0px solid #990000;
 border-bottom: 1px solid #990000;
 border-left: 1px solid #990000;
}
td.Postalcode {
 border-top: 0px solid #990000;
 border-right: 1px solid #990000;
 border-bottom: 0px solid #990000;
 border-left: 0px solid #990000;
 text-align: center;
}
td.inputCol {
 border-top-width: 0px;
 border-right-width: 0px;
 border-bottom-width: 1px;
 border-left-width: 0px;
 border-top-style: solid;
 border-right-style: solid;
 border-bottom-style: solid;
 border-left-style: solid;
 border-top-color: #666666;
 border-right-color: #666666;
 border-bottom-color: #666666;
 border-left-color: #666666;
 width: 320px;
 height: 40px;
 font-family: "黑体";
 font-size: 16px;
}
#divMailer{
 width:520px;
 background-color: #FFFFFF;
 position: absolute;
}
</style>
</head>

<body>
<script language="JavaScript">
<![CDATA[
<!--
function window_onload(){
 mailerSkin.style.height = tlbMailer.clientHeight + 10;
}
window.onload = window_onload;
//-->
]]>
</script>
<!-- ***************** 信封主体用一个表格排版,用VML显示信封Skin&&Shaow *****************-->
<v:rect id="mailerSkin" strokecolor="black" fillcolor="white" style="position:relative;left:20;top:5;width:550px;height:320px;z-index:9">
 <v:shadow on="t" type="single" color="silver" offset="5px,5px"></v:shadow>
    <v:textbox id="mailerContent" inset="1,1,1,1">
  <table width="550" border="0" align="center" cellpadding="6" cellspacing="0" id="tlbMailer">
    <tr>
      <td><xsl:apply-templates select="*/收信人/邮编"/></td>
    </tr>
    <tr>
      <td><xsl:apply-templates select="*/收信人"/></td>
    </tr>
    <tr>
      <td>&#160;</td>
    </tr>
    <tr>
      <td><xsl:apply-templates select="*/发信人"/></td>
    </tr>
    <tr>
      <td>&#160;</td>
    </tr>
    <tr>
      <td align="right"><xsl:apply-templates select="*/发信人/邮编"/></td>
    </tr>
  </table>
 </v:textbox>
</v:rect>
</body>
</html>
</xsl:template>

<!-- ********************  显示邮政编码到一个有边框的Table中 ******************** -->
<xsl:template match="邮编">
 <table width="150" border="0" cellpadding="2" cellspacing="0" class="Postalcode">
  <tr>
 <!-- 把邮政编码字符串从头到尾遍历一遍,每个号码放到一个td中 -->
   <xsl:call-template name="eachPostalCodeNum">
    <xsl:with-param name="CodePositon" select="1"/> 
    <xsl:with-param name="PostalCodeStr" select="string(.)"/> 
   </xsl:call-template>
  </tr>
 </table>
</xsl:template>

<!-- ********* 遍历邮政编码的一个Template,参数CodePosition是当前字符位置,参数PostalCodeStr是字符串参数,通过递归方式调用自身来循环字符串 ************* -->
<xsl:template name="eachPostalCodeNum">
 <xsl:param name="CodePositon"/>
 <xsl:param name="PostalCodeStr"/>
 <xsl:variable name="CodeLen" select="string-length($PostalCodeStr)"/>
 
 <td class="Postalcode"><xsl:value-of select="substring($PostalCodeStr,$CodePositon,1)"/></td>
 <xsl:if test="$CodePositon &lt; $CodeLen">
  <xsl:call-template name="eachPostalCodeNum">
   <xsl:with-param name="CodePositon" select="$CodePositon + 1"/> 
   <xsl:with-param name="PostalCodeStr" select="$PostalCodeStr"/> 
  </xsl:call-template>
 </xsl:if>
</xsl:template>

<!-- ********************  显示收信人的相关信息 ******************** -->
<xsl:template match="收信人">
 <table width="420" border="0" cellspacing="0" cellpadding="2">
       <tr>
         <td align="right" valign="bottom">&#160;</td>
         <td align="right" valign="bottom">收信人地址</td>
       <td valign="bottom" class="inputCol"><xsl:value-of select="地址"/></td>
      </tr>
      <tr>
        <td align="right" valign="bottom">&#160;</td>
        <td align="right" valign="bottom">收信人姓名</td>
        <td valign="bottom" class="inputCol"><xsl:value-of select="姓名"/></td>
      </tr>
    </table>
</xsl:template>

<!-- ********************  显示发信人的相关信息 ******************** -->
<xsl:template match="发信人">
 <table width="420" border="0" align="right" cellpadding="2" cellspacing="0">
        <tr>
         <td align="right" valign="bottom">发信人地址</td>
       <td valign="bottom" class="inputCol"><xsl:value-of select="地址"/></td>
       <td valign="bottom">&#160;</td>
      </tr>
      <tr>
        <td align="right" valign="bottom">发信人姓名</td>
        <td valign="bottom" class="inputCol"><xsl:value-of select="姓名"/></td>
        <td>&#160;</td>
      </tr>
    </table>
</xsl:template>
</xsl:stylesheet>

 

 

<?xml version="1.0" encoding="GB2312"?>
<?xml-stylesheet type="text/xsl" href="Mailer.xsl"?>
<信封>
 <收信人>
  <姓名>收信人</姓名>
  <邮编>100085</邮编>
  <地址>北京市xxxx公司</地址>
 </收信人>
 <发信人>
  <姓名>发信人</姓名>
  <邮编>100085</邮编>
  <地址>北京市xxxx公司</地址>
 </发信人>
</信封>