简体   繁体   English

使用xslt将xml转换为html

[英]xml transform to html using xslt

I'm trying to use key function to transform xml to html look like: 我正在尝试使用键函数将xml转换为html,如下所示:

but I don't know how to make two table, because my if function write books one under other. 但是我不知道如何制作两张桌子,因为我的if函数在其他下面写了一本书。 A XML looks like: XML看起来像:

<library>
<books>
    <book aut="JKR">
        <title>Harry Potter and the Sorcerer's Stone</title>
        <quantity>5</quantity>
    </book>
</books>
<books>
    <book aut="JKR">
        <title>example</title>
        <quantity>3</quantity>
    </book>
    <book aut="AC">
        <title>example</title>
        <quantity>2</quantity>
</books>
<authors>
    <author id="JKR">J.K.Rowling</author>
    <author id="AC"> Agatha Christie</author>
<authors>

And is fragment xslt code: 片段是xslt代码:

  <?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" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" />
    <xsl:output method="html"  encoding="iso-8859-2" />
    <xsl:key name="idauthor" match="author" use="@id"/>
    <xsl:template match="/">
        <html>
            <head>
                <meta content="text/html" />
                       </head>
     <body>

      <table border="1">
            <xsl:apply-templates select="//book"/>
      </table>

    </body>
  </html>
</xsl:template>

<xsl:template match="book">


   <xsl:if test="key('idauthor',@author)">

      <tr>   author:
            <td> <xsl:value-of select="title" /></td>
            <td> <xsl:value-of select="quantity" /></td>
      </tr>
     </xsl:if >
  </xsl:template>   
</xsl:stylesheet>

If your input has an authors index, and you want to report by author, then you should start with that. 如果您的输入具有authors索引,并且您希望按作者报告,那么您应该从那开始。

<xsl:apply-templates select="authors/author"/>

You then want to apply the key to books, not authors: 然后,您希望将密钥应用于书籍,而不是作者:

<xsl:key name="books-by" match="book" use="@aut"/>

Finally, for each author, you want to select the books by the author's id: 最后,对于每位作者,您希望按作者的ID选择书籍:

<table border="1">
    <xsl:apply-templates select="key('books-by', @id)" />
</table>

The following transform 以下转换

<?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" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" />
    <xsl:output method="html"    encoding="iso-8859-2" />
    <xsl:key name="books-by" match="book" use="@aut"/>

    <xsl:template match="/library">
        <html>
            <head>
                <meta content="text/html" />
            </head>
            <body>
                <xsl:apply-templates select="authors/author"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="author">
        <h2>
            <xsl:value-of select="."/>
        </h2>
        <table border="1">
            <xsl:apply-templates select="key('books-by', @id)" />
        </table>

    </xsl:template>

    <xsl:template match="book">
        <tr>
            <td> <xsl:value-of select="position()" /></td>
            <td> <xsl:value-of select="title" /></td>
            <td> <xsl:value-of select="quantity" /></td>
        </tr>
    </xsl:template>     
</xsl:stylesheet>

applied to your (corrected) input, 应用于您的(更正的)输入,

<library>
    <books>
        <book aut="JKR">
            <title>Harry Potter and the Sorcerer's Stone</title>
            <quantity>5</quantity>
        </book>
    </books>
    <books>
        <book aut="JKR">
            <title>example</title>
            <quantity>3</quantity>
        </book>
        <book aut="AC">
            <title>example</title>
            <quantity>2</quantity>
        </book>
    </books>
    <authors>
        <author id="JKR">J.K.Rowling</author>
        <author id="AC"> Agatha Christie</author>
    </authors>
</library>

produces the following HTML: 生成以下HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <META http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta content="text/html">
    </head>
    <body>
        <h2>J.K.Rowling</h2>
        <table border="1">
            <tr>
                <td>1</td>
                <td>Harry Potter and the Sorcerer's Stone</td>
                <td>5</td>
            </tr>
            <tr>
                <td>2</td>
                <td>example</td>
                <td>3</td>
            </tr>
        </table>
        <h2> Agatha Christie</h2>
        <table border="1">
            <tr>
                <td>1</td>
                <td>example</td>
                <td>2</td>
            </tr>
        </table>
    </body>
</html>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM