`
xinklabi
  • 浏览: 1591578 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

XML+XSLT+xalan-j+svg生成地图

 
阅读更多

XML+XSLT+xalan-j+svg生成地图

schema文件:site.xsd

 

[xhtml] view plaincopy
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">  
  3.     <xs:element name="note">  
  4.         <xs:complexType>  
  5.             <xs:sequence>  
  6.                 <xs:element name="site" maxOccurs="unbounded">  
  7.                     <xs:complexType>  
  8.                         <xs:sequence>  
  9.                             <xs:element name="sitename" type="xs:string"/>  
  10.                             <xs:element name="x" type="xs:decimal"/>  
  11.                             <xs:element name="y" type="xs:decimal"/>  
  12.                             <xs:element name="linksite" maxOccurs="unbounded">  
  13.                                 <xs:complexType mixed="true">  
  14.                                     <xs:attribute name="distance" type="xs:decimal"/>  
  15.                                 </xs:complexType>  
  16.                             </xs:element>  
  17.                         </xs:sequence>  
  18.                     </xs:complexType>  
  19.                 </xs:element>  
  20.             </xs:sequence>  
  21.         </xs:complexType>  
  22.     </xs:element>  
  23. </xs:schema>  

 

xml文件:sitedata.xml

 

[xhtml] view plaincopy
 
  1. <?xml version="1.0" encoding="GB2312"?>  
  2. <?xml-stylesheet type="text/xsl" href="sitetosvgmap.xsl"?>  
  3.   
  4. <note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:/study/xml/map/site.xsd">  
  5.     <site>  
  6.         <sitename>雍和宫</sitename>  
  7.         <x>300.5</x>  
  8.         <y>40.5</y>  
  9.         <linksite distance="200">长城</linksite>  
  10.         <linksite distance="400">天坛</linksite>  
  11.         <linksite distance="200">新街口</linksite>  
  12.     </site>  
  13.     <site>  
  14.         <sitename>长城</sitename>  
  15.         <x>20</x>  
  16.         <y>93</y>  
  17.         <linksite distance="20">雍和宫</linksite>  
  18.         <linksite distance="30">地安门</linksite>  
  19.     </site>  
  20.     <site>  
  21.         <sitename>天坛</sitename>  
  22.         <x>100</x>  
  23.         <y>23</y>  
  24.         <linksite distance="20">雍和宫</linksite>  
  25.         <linksite distance="10">前门</linksite>  
  26.     </site>  
  27.     <site>  
  28.         <sitename>地坛</sitename>  
  29.         <x>200</x>  
  30.         <y>223</y>  
  31.         <linksite distance="20">雍和宫</linksite>  
  32.         <linksite distance="10">地安门</linksite>  
  33.     </site>  
  34.     <site>  
  35.         <sitename>地安门</sitename>  
  36.         <x>200</x>  
  37.         <y>23</y>  
  38.         <linksite distance="10">地坛</linksite>  
  39.     </site>  
  40.       
  41.     <site>  
  42.         <sitename>前门</sitename>  
  43.         <x>100</x>  
  44.         <y>523</y>  
  45.         <linksite distance="20">雍和宫</linksite>  
  46.         </site>  
  47.           
  48. </note>  

 

 

下面这个可是,先贴上代码再说

xslt文件:sitetosvg.xslt

 

[xhtml] view plaincopy
 
  1. <?xml version="1.0" encoding="gb2312"?>  
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  3.     <!--   定义XSLT转换后输出的文件的格式,这里输出为XML格式的文件内容   -->  
  4.     <xsl:output method="xml" indent="yes" encoding="UTF-8" version="1.0" standalone="no" media-type="image/svg+xml"/>  
  5.     <xsl:template match="note">  
  6.         <svg width="100%" height="100%">  
  7.         <xsl:for-each select="site">            
  8.             <!--得到起始站点的坐标x,y并存入变量中-->  
  9.             <xsl:variable name="x" select="x"/>  
  10.             <xsl:variable name="y" select="y"/>  
  11.             <xsl:variable name="sitename" select="sitename"/>           
  12.             <!--根据上面赋值后的变量按坐标输出起始站点的名称-->  
  13.             <text x="{$x}" y="{$y}">  
  14.             <xsl:value-of select="sitename"/>  
  15.             <xsl:value-of select="x"/>  
  16.             <xsl:value-of select="y"/>  
  17.             </text>  
  18.               
  19.             <!--根据上面赋值后的变量按坐标输出圆圈代表起始站点-->  
  20.             <circle cx="{$x}" cy="{$y}" r="4"   
  21.             style="fill:white;stroke-width:2;stroke:black;fill-opacity:0"/>  
  22.               
  23.             <!--查找与起始站点直接相连的站点,这块有点晕!!!!!for-each的select表示当前结点的子结点,也就是linksite-->  
  24.             <xsl:for-each select="./linksite">     
  25.               
  26.             <xsl:variable name="linkname" select="."/><!--还有这块,是查找当前结点所有的linksite-->  
  27.                 
  28.             <xsl:for-each select="/note/site">  
  29.   
  30.             <xsl:if test="sitename=$linkname">               
  31.             <xsl:variable name="lx" select="x"/>  
  32.             <xsl:variable name="ly" select="y"/>  
  33.             <line x1="{$x}" y1="{$y}" x2="{$lx}" y2="{$ly}"  
  34. style="stroke:rgb(99,99,99);stroke-width:2"/>  
  35.             </xsl:if>  
  36.             </xsl:for-each>  
  37.                             
  38.                 
  39.             </xsl:for-each>  
  40.               
  41.             </xsl:for-each>  
  42.                   
  43. <!--     <xsl:for-each select="/note/site">  
  44.   
  45.             <xsl:if test="sitename='雍和宫'">  
  46.             <xsl:variable name="pos" select="position()*30"/>  
  47.                
  48.             <text x="{$pos}" y="400">  
  49.             <xsl:value-of select="sitename"/>  
  50.             </text>  
  51.             </xsl:if>  
  52.               
  53.               
  54.       
  55.               
  56.               
  57.             <xsl:for-each select="/note/site[sitename=$linkname]">  
  58.               
  59.             <text x="{$x+100}" y="{$y+100}">  
  60.             heihei  
  61.             </text>  
  62.              
  63.             <xsl:variable name="lx" select="x"/>  
  64.               
  65.             <text x="300" y="300">  
  66.             <xsl:value-of select="x"/>  
  67.             </text>     
  68.             <xsl:variable name="ly" select="y"/>  
  69.              <text x="400" y="400">  
  70.             <xsl:value-of select="y"/>  
  71.             </text>    
  72.               
  73.             <line x1="{$x}" y1="{$y}" x2="{$lx}" y2="{ly}"  
  74.                style="stroke:rgb(99,99,99);stroke-width:2" mce_style="stroke:#636363;stroke-width:2"/>  
  75.   
  76.               
  77.             <text x="{$lx+30}" y="{$ly+40}">  
  78.             <xsl:value-of select="sitename"/>  
  79.             </text>        
  80.                  
  81.             </xsl:for-each>    
  82.               
  83.               
  84.                   
  85.             </xsl:for-each>  
  86.             </xsl:for-each>-->  
  87.         </svg>  
  88.     </xsl:template>  
  89. </xsl:stylesheet>  

 

如果要把上面的sitetosvg.xslt转换为带有图形格式的可以用浏览器(装有SVGView)显示的svg文件,需要用到两个jar包,分别是xerces.jar和xalan.jar。

网上有下载这两个文件的,下载后需要配置,这样:

1.配置系统环境变量,将D:/Program Files/Java/jdk1.5.0_22/bin加到path中,前提是安装了jdk

2.将上面提到的两个jar包放到D:/Program Files/Java/jdk1.5.0_22/jre/lib/ext中

3.在cmd中运行命令行: java org.apache.xalan.xslt.Process -IN sitedata.xml -XSL sitetosvg.xslt -OUT map.svg

然后会在跟sitedata.xml 、sitetosvg.xslt 相同的目录下生成map.svg文件,直接打开久可以看到地图了。

 

说明:

1.当初不明白怎么用xslt转换成svg,老郁闷了,现在实现了,但是不尽理想。因为我当时是这样想的:写出xslt文件之后(当然此文件里也需要svg来画图),在网页中用javascript来调用xml文件以及xslt文件,但是很遗憾,不知道咋地,图形显示不出来,我已经试了很多方法。

2.用javascript的方法有一个好处是:每次直接打开网页就可以,不用向上述转换的方式还要用java把xslt转换成svg。也就是说如果xml文件或xslt文件有改动的话,还有用java重新转一次,而javascipt方法就不必这么麻烦。所以,还要在想想办法怎么解决这个问题。

3.就是头疼的xslt还有xpath,因为总是搞不清楚当前结点是什么,还有for-each的多层嵌套。不过试了一天,总算是试出来了。

4.还有一点就是站点的连线有直线表示的,因为还有一个用c++写的求最短路径的程序,所以直接用直线的长度代表曲线的长度了。

分享到:
评论

相关推荐

    Java-SVG转图片所需jar包

    2. **xalan-2.6.0.jar**:Xalan是XSL Transformations (XSLT)的处理器,用于将XML文档转换为其他格式,包括HTML和SVG。在SVG到图片的转换过程中,Xalan可能被用来处理与SVG相关的XSLT样式表。 3. **fop-0.94.jar**...

    activation.jar mail.jar xmlsec-1.2.1.jar xalan.jar

    在处理XML数据时,尤其是在生成动态报告、网页或需要从XML数据生成其他格式的场景下,Xalan-Java是一个强大的工具。 这四个jar文件组合在一起,可能意味着一个Java应用项目中涉及了邮件通信、XML数据的安全处理和...

    CheckStyle缺失组件.rar

    3. `org.apache.servicemix.bundles.xalan-serializer-2.7.1_1.jar`:这个文件是Xalan的序列化器组件,它提供了将XML数据序列化为各种输出格式(如文本、HTML、SVG等)的功能。这个组件通常与Xalan一起使用,负责...

    fop转pdf依赖的jar包

    总的来说,这些JAR包构成了FOP转换PDF所需的完整环境,涵盖了从XML解析、XSLT转换到PDF生成的全过程。在实际应用中,开发者需要将这些依赖项添加到项目的类路径中,确保FOP能够正确运行并完成PDF转换任务。在Java...

    xml学习的综合资料

    在学习过程中,配合这些资料,你可能还需要了解一些相关工具,如XML编辑器(如Notepad++、Oxygen XML Editor等)、XML验证器(如XMLStarlet、xmllint)以及XSLT处理器(如Saxon、Xalan)。同时,理解XML与XHTML、SVG...

    Apache Fop1.0 Pdf demp

    这通常涉及加载XML文件,应用XSLT转换,然后使用Fop工厂和Fop对象生成PDF。代码中可能还包含了XSL样式表文件,定义了XML数据的转换规则。 7. **调试与问题解决**:在实际使用过程中,可能会遇到各种问题,比如FO...

    tif图片转png文件相关jar包

    2. **xalan-2.7.2.jar**:Xalan是XSL Transformations(XSLT)的Java实现,用于将XML文档转换为其他格式,如HTML或PDF。虽然不直接处理图像转换,但在处理包含图像的数据时,可能会用到XSLT进行整体转换。 3. **...

    java_lib.7z

    9. **fop-0.94.jar**: Apache FOP是一个用于生成PDF、SVG等格式的XSL-FO处理器,可以将XML文档转换为高质量的打印或电子文档。 10. **poi-3.10-beta2.jar**: 同上,这是Apache POI的一个版本,可能是项目的另一个...

    instantmessage-lib

    5. **Xalan**: `xalan-2.5.1.jar`是一个XSLT处理器,用于转换XML文档。在即时消息系统中,可能用于处理XML格式的数据,例如用户的聊天记录或状态信息。 6. **Batik and FOP**: `batik-1.5-fop-0.20-5.jar`和`fop-...

    Apache-fop

    在实际应用中,Apache FOP常被集成到XML工作流中,与XSLT处理器(如Saxon或Xalan)配合,为企业提供自动化文档生成和格式转换的解决方案。此外,FOP也被广泛应用于报表系统、电子出版、文档管理等领域。 总的来说,...

    apache-forrest-0.8.zip

    这些文件可能位于`conf`目录下,包括`forrest.properties`、`site.xml`等,它们控制了Forrest如何处理输入和生成输出。 3. **库文件**:`.jar`文件通常位于`lib`目录,包含了Forrest运行所需的依赖库,包括Apache的...

    Dungeon Master Ruler-开源

    2. **xalan-2.7.0.jar**:Xalan是Apache的一个XSLT处理器,用于将XML文档转换为其他格式,如HTML或PDF,这在生成游戏手册或冒险记录时非常有用。 3. **jaxb-xjc.jar, jaxb1-impl.jar, jaxb-impl.jar**:这些是Java...

    xWire Framework-开源

    4. **fop-0.20.5.jar**:Apache FOP用于将XML格式转换成PDF,与Xalan结合,能帮助xWire生成高质量的PDF文档。 5. **xercesImpl-2.6.2.jar**:Apache Xerces是一个XML解析器,它负责解析和验证XML文档,是xWire处理...

Global site tag (gtag.js) - Google Analytics