多子结构的XSLT

时间:2015-06-11 15:15:40

标签: xml xslt

我正在使用XSLT将XML转换为HTML。

这是我正在运行的代码

     <?xml version="1.0" encoding="UTF-8"?>
     <product>
       <auto>
           <admin>
             <date>2015</date>
             <age>28</age>
             <level>3</level>
             <subject>
                <id>1</id>        
             </subject>
           </admin>
           <report>
             <Fname>John</Fname>
             <Lname>AA</Lname>
             <subject>
                <id>1</id>        
             </subject>
           </report>
        </auto>
        <auto>
          <admin>
             <date>02/02/2015</date>
             <age>29</age>
             <level>2</level>
             <subject>
                 <id>1</id>       
             </subject>
          </admin>
          <report>
             <Fname>Jack</Fname>
             <Lname>BB</Lname>
          </report>
        </auto>
     </product>

这是我的Running XSLT

   <?xml version="1.0" encoding="UTF-8"?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
   <html lang="en">
   <head>
    <title>Example</title>
    <script type="text/javascript">
      <![CDATA[
    function toggleDisplay(element) 
    {        
        element.style.display = element.style.display === 'none' ? '' : 'none'; 
    };
    function toggleDisplayAll(elements) 
    { 
        for(var i=0; i<elements.length; i++){
            toggleDisplay(elements[i]);
        }
    }   
  ]]>
    </script>
  </head>
  <body>
    <h1>Example</h1>
    <xsl:apply-templates/>
  </body>
  </html>
  </xsl:template>
  <xsl:template match="product/auto">
    <ul>
    <a onclick="toggleDisplayAll(this.parentNode.getElementsByTagName('ul')); return false;" href="#">
    <xsl:value-of select="report/Fname"/>
    </a>
    <xsl:apply-templates select="admin"/>
    <!--<xsl:apply-templates select="report"/>-->
    </ul>
 </xsl:template>
 <xsl:template match="date">
   <li style="display:none;">
    <xsl:value-of select="concat('Date : ',.)"/>
   </li>
</xsl:template>
<xsl:template match="age">
   <li style="display:none;">
     <xsl:value-of select="concat('Age : ',.)"/>
   </li>
</xsl:template>
<xsl:template match="level">
   <li style="display:none;">
     <xsl:value-of select="concat('Level : ',.)"/>
   </li>
</xsl:template>
<xsl:template match="id">
   <li style="display:none;">
     <xsl:value-of select="concat('ID : ',.)"/>
   </li>
</xsl:template> 
 <xsl:template match="subject">
    <li style="display:none;">
       <a onclick="toggleDisplayAll(this.parentNode.getElementsByTagName('li')); return false;" href="#">
          <xsl:text>Subject: </xsl:text>
       </a>
       <ul>
          <xsl:apply-templates select='*'/>
       </ul>
     </li>
  </xsl:template>
  <xsl:template match="admin">
    <ul  style="display:none;">
       <a onclick="toggleDisplayAll(this.parentNode.getElementsByTagName('li')); return false;" href="#">
         <xsl:text>Admin: </xsl:text>
       </a>
       <ul style="display:none;">
         <xsl:apply-templates select='*'/>
       </ul>
    </ul>
  </xsl:template>
  </xsl:stylesheet>

它正在回归我

     John
     Jack

点击John后

     John
         . Admin:             
     Jack

点击Admin

     John
         . Admin:
             . Date: 2015
             . Age: 28
             . Level: 3
             . Subject:             
     Jack

但是Subject是一个链接,我想在点击它时将id显示为子元素,如下所示

     John
         . Admin:
             . Date: 2015
             . Age: 28
             . Level: 3
             . Subject:
                   .Id:  1             
     Jack

1 个答案:

答案 0 :(得分:0)

添加日期,年龄,级别,ID,州和国家/地区的模板。 然后在admin的子项上应用模板并报告而不是value-of。

通过“添加模板”,我的意思是(未经过测试,可能有'错字'):

<xsl:template match="date">
     <li><xsl:value-of select="concat('Date : ',.)"/></li>
</xsl:template>

为每个元素添加类似的模板(实际上你可以使用一个可以使用元素名称的通用模板,但在我的回答中试图保持简单)。

然后是管理员模板:

<xsl:template match="admin">
 <ul style="display:none;">
  <li>
    <xsl:text>Admin: </xsl:text>
    <xsl:apply-templates select='*'/>
    <br/>
  </li>
</ul>
 </xsl:template>

对报告模板执行相同操作。