从xslt检查xml中的多个节点值并以html显示

时间:2014-05-28 12:54:27

标签: html xml xslt xpath

我有一个XML文件,我通过导出数据库获得。现在我需要将html页面中的xml数据显示为表格。为此,我必须从XSLT文件中检查XML文件中特定数据的相应值。由于我的数据库有点复杂,我在检查不同节点的多个值以及从xml文件的另一个节点中选择相应的值时遇到了困难。例如我有以下xml数据 -

   <?xml-stylesheet type='text/xsl' href='myXSL.xsl'?>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <name1>
    <names>
      <id>5</id>
      <class>space</class>
      <from>Germany</from>      
      <fm>
        <id>9</id>
        <names>5</names>
        <name>Vienna</name>        
      </fm>
      <fm>
        <id>10</id>
        <names>5</names>
        <name>Prague</name>        
      </fm>
    </names>    
  </name1>
  <FFrom>    
    <effect>
      <id>11</id>
      <DVV>1</DVV>
      <SAT>0</SAT>
      <DDCC>0</DDCC>      
      <name>SAA Name</name>      
    </effect>    
    <effect>
      <id>23</id>
      <DVV>0</DVV>
      <SAT>0</SAT>
      <DDCC>1</DDCC>      
      <name>SAA Name2</name>      
    </effect>
  </FFrom>  
  <name2>
    <newNames>
      <id>1</id>
      <name>VSSS Name</name>
      <route1>
        <id>5</id>
        <identifyer>C</identifyer>
        <function>abc</function>
        <names>4</names>
        <naviagtes2>
          <id>9</id>
          <fm>7</fm>
          <effect>2</effect>          
        </naviagtes2>
        <naviagtes2>
          <id>10</id>
          <fm>8</fm>
          <effect>5</effect>         
        </naviagtes2>
      </route1>  
    </newNames>
    <newNames>
      <id>6</id>
      <name>VEE Name</name>
      <route1>
        <id>18</id>
        <identifyer>C0</identifyer>
        <function>abc</function>
        <names>5</names>
        <naviagtes2>
          <id>68</id>
          <fm>9</fm>
          <effect>11</effect>          
        </naviagtes2>
        <naviagtes2>
          <id>69</id>
          <fm>10</fm>
          <effect>7</effect>          
        </naviagtes2>
      </route1>       
    </newNames>
  </name2>
</root>

我使用了以下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>

 <head><title>title</title>
 <style type="text/css">

body {
    font: 10px Verdana, sans-serif;
    color: #000000;
    margin: 0;
    padding: 0;
}
tr.header2 {
    font-style:italic;
}
tr.newNames{
    background-color:#6495ED;
    margin-top:4px;
}
</style>
</head>
<body><h1><xsl:value-of select="Title" /></h1>
 <table width="800px" class="table" cellspacing="0px"> 
 <xsl:for-each select="root/name2/newNames"> 
  <tr class="newNames"><td colspan="12">
  <b>NNavigate:</b> <xsl:value-of select="name"/><br/>
  <b>NMNaviagate:</b> <xsl:value-of select="route1/function"/>
  </td></tr>
    <xsl:for-each select="/root/name1/names">
    <tr class="names"><td colspan="12">
    <b> CClass: </b><xsl:value-of select="class" />
    <b> FFrom: </b><xsl:value-of select="from" />   
    </td></tr>  
        <tr class="header2">
            <td>Route</td>
            <td>From</td>
            <td align="center">SA</td>
            <td align="center">DB</td>

        </tr>
        <xsl:for-each select="fm">
        <tr>
            <td class=""><xsl:value-of select="name" /></td>                
            <td class=""><xsl:value-of select="/root/FFrom/effect/name" /></td>
            <td class=""><xsl:value-of select="/root/FFrom/effect/SAT" /></td>
            <td class=""><xsl:value-of select="/root/FFrom/effect/DVV" /></td>              
        </tr>
        </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>
</table>
 </body>
 </html>
</xsl:template>

</xsl:stylesheet>

我陷入了以下困境。 如果你注意到有fm节点,效果节点和naviagtes2节点。 在我的html页面中,将有一个表,其中第一列的值来自fm节点(root / name1 / names / fm / name),第二列的值来自效果节点(root / FFrom / effect / name)。在naviagtes2节点中,有fm和effect元素,它们相当于fm / id和effect / id。也就是说,naviagtes2节点用于检查效果/名称的哪些值将对照表中的fm / name。条件如下

root/name1/names/fm/name against root/FFrom/effect/name if 
root/name1/names/fm/id = root/name2/newNames/route1/naviagtes2/fm  and 
root/FFrom/effect/id = root/name2/newNames/route1/naviagtes2/effect

我是XSLT编程的新手。任何人都可以给我任何线索,请问如何在XSLT中解决这个问题?

1 个答案:

答案 0 :(得分:0)

  

恐怕我还是不明白你的问题,但是为了向前推进这个问题,我会在它身上刺伤(在黑暗中?)。

以下样式表使用将每个naviagtes2节点链接到其id在naviagtes2节点中列出的fm和效果元素。因此,每个naviagtes2节点创建一个{fm,effect}&#34;对&#34;并且这些对列在结果表中,以及从配对元素中提取的值:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="fm" match="name1/names/fm" use="id" />
<xsl:key name="effect" match="FFrom/effect" use="id" />

<xsl:template match="/">
    <table border="1" > 
        <tr>
            <th>id</th>
            <th>fm id</th>
            <th>effect id</th>
            <th>fm name</th>
            <th>effect name</th>
        </tr>
        <xsl:for-each select="root/name2/newNames/route1/naviagtes2"> 
            <tr>
                <td><xsl:value-of select="id" /></td>
                <td><xsl:value-of select="fm" /></td>
                <td><xsl:value-of select="effect" /></td>
                <td><xsl:value-of select="key('fm', fm)/name" /></td>
                <td><xsl:value-of select="key('effect', effect)/name" /></td>
            </tr>       
        </xsl:for-each>
    </table>
</xsl:template>

</xsl:stylesheet>

应用于示例输入时,结果为:

<?xml version="1.0" encoding="UTF-8"?>
<table border="1">
   <tr>
      <th>id</th>
      <th>fm id</th>
      <th>effect id</th>
      <th>fm name</th>
      <th>effect name</th>
   </tr>
   <tr>
      <td>9</td>
      <td>7</td>
      <td>2</td>
      <td/>
      <td/>
   </tr>
   <tr>
      <td>10</td>
      <td>8</td>
      <td>5</td>
      <td/>
      <td/>
   </tr>
   <tr>
      <td>68</td>
      <td>9</td>
      <td>11</td>
      <td>Vienna</td>
      <td>SAA Name</td>
   </tr>
   <tr>
      <td>69</td>
      <td>10</td>
      <td>7</td>
      <td>Prague</td>
      <td/>
   </tr>
</table>
HTML中的

将呈现为:

enter image description here

希望这能让你更接近目标。