2

XSLTをいじり始めましたが、いくつか問題があります。一連の価値のある選択命令を使用してXMLドキュメントを出力することができましたが、XSLTテンプレートを自分で作成することに関しては本当に苦労しています。

これが私のXMLです:

<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="lecturers.xsl"?>
<lecturers>
<lecturer>
        <name> 
             <title>Professor</title> 
        <first>Peter </first> <last>Quirk</last>
        </name>
        <teaching>
        <course code="CO3070">XML and the Web</course>
        <course code="CO3300"> Web Server Architectures</course>
    </teaching>
    <research>
        The application of Web protocols to Biology
    </research>
</lecturer>

<lecturer>
    <name> 
    <title>Doctor</title> 
    <first>Brian </first> <last>Johnson</last>
    </name>
    <teaching>
        <course code="CO9999">Computer Hacking</course>
        <course code="CO3300"> Web Server Architectures</course>
    </teaching>
    <research>
        Investigating the various complexities of Computer Hacking
    </research>
</lecturer>

次に、これが現在の私のXSLです。

 <?xml version="1.0"?>
 <xsl:stylesheet version='1.0' xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" version="4.0" />

 <xsl:template match="/">
 <html>
 <head>
 <title>XML Week 7</title>
 </head>

  <body>
  <h1>Week 7: Lecturers file turned to XSL:Template</h1>

 <table border="1">
<tr>
    <th><b>Title</b></th>
    <th><b>Name</b></th>
    <th><b>Teaching</b></th>
    <th><b>Research</b></th>
</tr>

<tr>

    <td><xsl:value-of select="lecturers/lecturer/name/title" /></td>
    <td><xsl:value-of select="lecturers/lecturer/name/first" /><xsl:text>&#x20;</xsl:text><xsl:value-of select="lecturers/lecturer/name/last" /></td>
    <td><xsl:value-of select="lecturers/lecturer/teaching/course" /> and <xsl:value-of select="(lecturers/lecturer/teaching/course)[2]" /></td>
    <td><xsl:value-of select="lecturers/lecturer/research" /></td>

</tr>
 </table>

</body>

</html>
 </xsl:template>
 </xsl:stylesheet>

これにより、必要な情報がテーブルに出力されますが、講師要素を保持する新しいテンプレートを作成し、次にその要素のコースの子を作成するように指示されました。頭の中で物事を複雑にしすぎているかもしれませんが、テンプレートをtdのいずれかに適用しようとすると、ブラウザで解析エラーが発生するため、機能させることができません。だから、誰かが私のためのヒントを持っていますか?私の例でそれを機能させる方法を説明するいくつかの基本的な例でさえ素晴らしいでしょう。みんな乾杯。

4

2 に答える 2

2

1 つのテンプレートを使用して、結果ドキュメント構造を作成します。

 <xsl:template match="/">
 <html>
 <head>
 <title>XML Week 7</title>
 </head>

  <body>
    <xsl:apply-templates/>

</body>

</html>
 </xsl:template>

次に、さらにテンプレートを作成してコンテンツを作成します。

<xsl:template match="lecturers">
  <h1>Week 7: Lecturers file turned to XSL:Template</h1>

 <table border="1">
<tr>
    <th><b>Title</b></th>
    <th><b>Name</b></th>
    <th><b>Teaching</b></th>
    <th><b>Research</b></th>
</tr>
  <xsl:apply-templates/>
</table>
</xsl:template>

<xsl:template match="lecturer">
<tr>

    <td><xsl:value-of select="name/title" /></td>
    <td><xsl:value-of select="name/first" /><xsl:text>&#x20;</xsl:text><xsl:value-of select="name/last" /></td>
    <td><xsl:value-of select="teaching/course" /> and <xsl:value-of select="(teaching/course)[2]" /></td>
    <td><xsl:value-of select="lecturers/lecturer/research" /></td>

</tr>
</xsl:template>

ご覧のとおり、テンプレートはapply-templates処理を維持するために を実行します。

[編集] コメントに応じて、要素のさまざまな子要素または子孫要素にさらにテンプレートを使用したい場合は、lecturer使用できます

<xsl:template match="lecturer">
   <tr>
     <xsl:apply-templates/>
   </tr>
</xsl:template>

次に、要素のテンプレートを記述します。

<xsl:template match="name/title | research">
  <td>
    <xsl:value-of select="."/>
  </td>
</xsl:template>

<xsl:template match="name/first">
  <td>
    <xsl:value-of select="concat(., ' ', ../last)"/>
  </td>
</xsl:template>

<!-- don't output name/last as the name/first template already does -->
<xsl:template match="name/last"/>

<xsl:template match="teaching">
  <xsl:apply-templates select="course"/>
</xsl:template>

<xsl:template match="course">
  <xsl:if test="position() > 1"><xsl:text> and </xsl:text></xsl:if>
  <xsl:value-of select="."/>
</xsl:template>
于 2012-12-03T11:21:28.287 に答える
1

あなたが現在持っている場所:

<tr>
    <td><xsl:value-of select="lecturers/lecturer/name/title" /></td>
    <td><xsl:value-of select="lecturers/lecturer/name/first" /><xsl:text>&#x20;</xsl:text><xsl:value-of select="lecturers/lecturer/name/last" /></td>
    <td><xsl:value-of select="lecturers/lecturer/teaching/course" /> and <xsl:value-of select="(lecturers/lecturer/teaching/course)[2]" /></td>
    <td><xsl:value-of select="lecturers/lecturer/research" /></td>
</tr>

を呼び出しapply-templatesて、lecturerテンプレートを用意する必要があります。

<xsl:template match="lecturer">
    <tr>

        <td><xsl:value-of select="name/title" /></td>
        <td><xsl:value-of select="name/first" /><xsl:text>&#x20;</xsl:text><xsl:value-of select="name/last" /></td>
        <td><xsl:value-of select="teaching/course" /> and <xsl:value-of select="(teaching/course)[2]" /></td>
        <td><xsl:value-of select="research" /></td>

    </tr>
</xsl:template>
于 2012-12-03T11:19:38.487 に答える