为给定的XML编写XSL文档时,无法弄清楚如何处理属性



我是XML和XSLT的新手。我一直在试着写XSL。但是我不知道如何在xsl中处理xml文档中的属性。

这是我的示例xml。

  <Books>
  <Book Cover="Paper back">
<Isbn>AS-1-4652-05128-2</Isbn>
<Title>Advanced Computing Theory</Title>
<Author>
  <Name>
    <First>John</First>
    <Last>Grisham</Last>
  </Name>
  <Contact Office="str1234">
    <Phone>782-999-1212</Phone>
  </Contact>
</Author>
<Publisher>Kendall Hunt</Publisher>
<Year Edition="2">
  <Year>1980</Year>
</Year>

这是我的XSL文档:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    version="1.0">
    <xsl:template match="/">
        <html> <body>
            <h1>Books</h1>
            <table border="1">
                <tr bgcolor="yellow">
                        <td><b>ISBN </b></td>
                        <td><b>Title</b></td>
                        <td><b>Author</b></td>
                        <td><b>Publisher</b></td>
                        <td><b>Year and Edition</b></td>
                </tr>
    <xsl:for-each select="Books/Book">
            <xsl:sort select="Title" />
            <tr style="font-size: 10pt; font-family: verdana">
                <td><xsl:value-of select="Isbn"/></td>
                <td><xsl:value-of select="Title"/></td>
                <xsl:for-each select="Author">
                <td><xsl:value-of select="First"/>&nbsp;<xsl:value-of select="Last"/> &nbsp;<xsl:value-of select="Phone"/> &nbsp; <xsl:value-of select="@Office"/> </td><!-- Problem here-->
                </xsl:for-each>
                <td><xsl:value-of select="Publisher"/></td>
                <td><xsl:value-of select="Year"/>&nbsp;<xsl:value-of select="@Edition"/> </td>!-- Problem here-->
            </tr>
    </xsl:for-each>
                </table>
    </body> </html>
    </xsl:template>
</xsl:stylesheet>

呈现的(相关的(HTML如下:

 <tr style="font-size: 10pt; font-family: verdana">
            <td>AS-1-4652-05128-2</td>
            <td>Advanced Computing Theory</td>
            <td></td><!--Empty-->
            <td>Kendall Hunt</td>
            <td>
               1980
               <!--Empty, No edition!-->
            </td>
         </tr>

我知道我遗漏了一个小细节,但不太明白是什么!

<td><xsl:value-of select="First"/>&nbsp;<xsl:value-of select="Last"/> &nbsp;<xsl:value-of select="Phone"/> &nbsp; <xsl:value-of select="@Office"/> </td>

FirstLast位于Name元素之下,因此它们需要分别为Name/FirstName/Last。类似地,Phone@OfficeContact之下,所以应该是Contact/PhoneContact/@Office。或者,如果同一作者可能有多个Contact,那么您可能需要考虑另一个for-each或模板。

也有类似的问题

<td><xsl:value-of select="Year"/>&nbsp;<xsl:value-of select="@Edition"/> </td>

其中EditionYear的属性,因此需要Year/@Edition

最新更新