图像与xsl和模板内的模板

时间:2014-12-12 21:27:53

标签: xml image xslt

我正在尝试在xml和xsl文件的表中添加图片。我在网上进行了研究并找到了这个解决方案:Here。 不过我的问题是我已经为我的桌子准备了一个模板。我尝试过Don Roby提出的解决方案(它不适用于我的情况),但因为我试图在另一个模板中使用模板,所以不接受。 所以我想知道我的具体情况是否有特殊解决方案,或者我是否刚刚犯了一些基本错误。

这是我的 XML 代码:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Employe.xsl"?>



<List_Of_Employe>



    <Employe>

        <ID> 1235 </ID>

        <Basic_Information>

            <Name> James Bond</Name>

            <Address>
                <Number > 05 </Number>
                <Street> Queen's street </Street>
                <Town> London </Town>
            </Address>

            <Phone_Number> 07876543210 </Phone_Number>

        </Basic_Information>

        <Photo> James.png </Photo>

        <Skills_Enable>
            <Skill_1> XML </Skill_1>
            <Skill_2> C# </Skill_2>
        </Skills_Enable>

    </Employe>

    <Employe>

        <ID> 1236 </ID>

        <Basic_Information>

            <Name> Sherlock Holmes </Name>

            <Address>
                <Number > 100 </Number>
                <Street> Prince's street </Street>
                <Town> London </Town>
            </Address>

            <Phone_Number> 07765432100 </Phone_Number>

        </Basic_Information>

        <Photo> Sherlock.png </Photo>

        <Skills_Enable>
            <Skill_1> JavaScript </Skill_1>
            <Skill_2> Python </Skill_2>
        </Skills_Enable>

    </Employe>


 </List_Of_Employe>

这是我的 XSL 代码(这是错误的):

<?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" indent="yes"/>

<xsl:template match="/">
<html>
<body>

    <h2>List of Workers</h2>
    <table border="1">
        <tr bgcolor="#9acd32">
            <th rowspan="3"> ID </th>
            <th colspan="5"> Basic Information </th>
            <th rowspan="3"> Picture </th>
            <th colspan="2"> Skills enable </th>
        </tr>
        <tr>
            <td rowspan="2"> Name </td>
            <td colspan="3"> Address </td>
            <td rowspan="2"> Phone Number </td>
            <td rowspan="2"> Skill 1 </td>
            <td rowspan="2"> Skill 2 </td>
        </tr>
        <tr>
            <td> Number </td>
            <td> Street </td>
            <td> Town </td>
        </tr>
        <xsl:for-each select="List_Of_Employe/Employe">
        <xsl:sort select="Name"/>
        <tr>
            <td><xsl:value-of select="ID"/></td>
            <td><xsl:value-of select="Basic_Information/Name"/></td>
            <td><xsl:value-of select="Basic_Information/Address/Number"/></td>
            <td><xsl:value-of select="Basic_Information/Address/Street"/></td>
            <td><xsl:value-of select="Basic_Information/Address/Town"/></td>
            <td><xsl:value-of select="Basic_Information/Phone_Number"/></td>
            <td><xsl:template match="Photo">
                <xsl:element name="img">
                    <xsl:attribute name="src">
                        <xsl:value-of select="."/>
                    </xsl:attribute>
                </xsl:element>
            </xsl:template></td>
            <td><xsl:value-of select="Skills_Enable/Skill_1"/></td>
            <td><xsl:value-of select="Skills_Enable/Skill_2"/></td>
        </tr>
        </xsl:for-each>
    </table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

希望你能帮助我

Mayeul

1 个答案:

答案 0 :(得分:0)

如您所述,您无法在另一个模板中使用模板。您应该做的更多是主模板之外的Photo模板,而是在其中使用xsl:apply-templates

<xsl:apply-templates select="Photo"/>

作为简化示例,请考虑此XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:template match="/">
      <html>
         <body>
            <h2>List of Workers</h2>
            <table border="1">
               <tr bgcolor="#9acd32">
                  <th> ID </th>
                  <th> Picture </th>
               </tr>
               <xsl:for-each select="List_Of_Employe/Employe">
                  <xsl:sort select="Name"/>
                  <tr>
                     <td>
                        <xsl:value-of select="ID"/>
                     </td>
                     <td>
                        <xsl:apply-templates select="Photo"/>
                     </td>
                  </tr>
               </xsl:for-each>
            </table>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="Photo">
      <xsl:element name="img">
         <xsl:attribute name="src">
            <xsl:value-of select="."/>
         </xsl:attribute>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>

实际上,您的Photo模板可以简化如下:

<xsl:template match="Photo">
    <img src="{.}"></img>
</xsl:template>

这里使用花括号称为&#34;属性值模板&#34;

在XSLT中通常首选使用模板。如果没有别的,如果有助于减少缩进!例如,也尝试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" indent="yes"/>
   <xsl:template match="/">
      <html>
         <body>
            <h2>List of Workers</h2>
            <table border="1">
               <tr bgcolor="#9acd32">
                  <th> ID </th>
                  <th> Picture </th>
               </tr>
               <xsl:apply-templates select="List_Of_Employe/Employe">
                  <xsl:sort select="Name"/>
               </xsl:apply-templates>
            </table>
         </body>
      </html>
   </xsl:template>

   <xsl:template match="Employe">
       <tr>
           <td>
              <xsl:value-of select="ID"/>
           </td>
           <td>
              <xsl:apply-templates select="Photo"/>
           </td>
        </tr>
   </xsl:template>   

   <xsl:template match="Photo">
      <img src="{.}"></img>
   </xsl:template>
</xsl:stylesheet>