使用xslt将xml目录转换为html

时间:2016-04-09 13:36:13

标签: html xml xslt

我的目标是将xml目录转换为html。 xml架构和xml文件格式正确且有效。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.w3schools.com"
    xmlns="http://www.w3schools.com"
    elementFormDefault="qualified">


<xs:element name="catalog"/>

<xs:complexType name="textint">
    <xs:sequence>
        <xs:element name="s" type="xs:string"/>
        <xs:element name="i" type="xs:int"/>
        <xs:element name="s" type="xs:string"/>
    </xs:sequence>
</xs:complexType>


<xs:complexType mixed="true" name="inttext">
    <xs:sequence>
        <xs:element name="i" type="xs:int"/>
        <xs:element name="s" type="xs:string"/>
        <xs:element name="i" type="xs:int"/>
        <xs:element name="s" type="xs:string"/>
    </xs:sequence>
</xs:complexType>




<xs:element name="Qstr">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="text" type="xs:string"/>
            <xs:element name="a" type="xs:string"/>
            <xs:element name="b" type="xs:string"/>
            <xs:element name="c" type="xs:string"/>
            <xs:element name="d" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>





<xs:element name="Qfl">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element name="text" type="textint"/>
            <xs:element name="a" type="xs:int"/>
            <xs:element name="b" type="xs:decimal"/>
            <xs:element name="c" type="xs:int"/>
            <xs:element name="d" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>




<xs:element name="Qinttext">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element name="text" type="inttext"/>
            <xs:element name="a" type="xs:int"/>
            <xs:element name="b" type="xs:int"/>
            <xs:element name="c" type="xs:int"/>
            <xs:element name="d" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>




<xs:element name="Qtextint">
    <xs:complexType mixed="true">
        <xs:sequence>   
            <xs:element name="text" type="xs:string"/>
            <xs:element name="a" type="textint"/>
            <xs:element name="b" type="xs:string"/>
            <xs:element name="c" type="xs:string"/>
            <xs:element name="d" type="textint"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>



</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>

<catalog xmlns="http://www.w3schools.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.w3schools.com   file:///home/n/workspace/webprog1/WebContent/schema.xml">

    <Qstr>
        <text>Welcher Mechanismus kann unter Unix zur Kommunikation über das Netzwerk verwendet werden?</text>
        <a>Sockets</a>
        <b>Message Queues</b>
        <c>Pipes</c>
        <d>Semaphore</d>
    </Qstr>

    <Qstr>
        <text>Die Hauptstadt von Italien ist:</text>
        <a>Rom</a>
        <b>Athen</b>
        <c>Bonn</c>
        <d>Madrid</d>
    </Qstr>

    <Qfl>
        <text> <s>Die Quadratwurzel von </s> <i>100</i> <s> ist:</s></text>
        <a>10</a>
        <b>2.76</b>
        <c>5</c>
        <d>1</d>
    </Qfl>

    <Qinttext>
        <text> <i>1</i> <s>+</s> <i>1</i> <s>= ?</s> </text>
        <a>2</a>
        <b>1</b>
        <c>3</c>
        <d>4</d>
    </Qinttext>

    <Qtextint>
        <text>Spinnen...</text>
        <a> <s>...haben </s> <i>8</i> <s> Beine</s> </a>
        <b>...sind Insekten</b>
        <c>...sind Vögel</c>
        <d> <s>...werden bis zu </s> <i>100</i> <s> Jahre alt</s> </d>
    </Qtextint>

    <Qstr>
        <text>Die Hauptstadt von Spanien ist:</text>
        <a>Madrid</a>
        <b>Barcelona</b>
        <c>Rom</c>
        <d>London</d>
    </Qstr>

</catalog>

接下来我创建了一个xsl样式表:

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

  <xsl:template match="/">

<html>

  <head>

   <title>Simple Quiz</title>

  </head>

  <body>

<xsl:for-each select="catalog/Qstr">

<table border="1">
    <tr bgcolor="orange">
      <th>Frage</th>
    </tr>
    <tr>
      <td><xsl:value-of select="text"/></td>
    </tr>
    <tr bgcolor="orange">
      <th>Antwortmöglichkeiten</th>
    </tr>
    <tr>
      <td><xsl:value-of select="a"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="b"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="c"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="d"/></td>
    </tr>


  </table>
</xsl:for-each>


<xsl:for-each select="catalog/Qfl">

<table border="1">
    <tr bgcolor="orange">
      <th>Frage</th>
    </tr>
    <tr>
      <td><xsl:value-of select="text"/></td>
    </tr>
    <tr bgcolor="orange">
      <th>Antwortmöglichkeiten</th>
    </tr>
    <tr>
      <td><xsl:value-of select="a"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="b"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="c"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="d"/></td>
    </tr>


  </table>
</xsl:for-each>


<xsl:for-each select="catalog/Qinttext">

<table border="1">
    <tr bgcolor="orange">
      <th>Frage</th>
    </tr>
    <tr>
      <td><xsl:value-of select="text"/></td>
    </tr>
    <tr bgcolor="orange">
      <th>Antwortmöglichkeiten</th>
    </tr>
    <tr>
      <td><xsl:value-of select="a"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="b"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="c"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="d"/></td>
    </tr>


  </table>
</xsl:for-each>


<xsl:for-each select="catalog/Qtextint">

<table border="1">
    <tr bgcolor="orange">
      <th>Frage</th>
    </tr>
    <tr>
      <td><xsl:value-of select="text"/></td>
    </tr>
    <tr bgcolor="orange">
      <th>Antwortmöglichkeiten</th>
    </tr>
    <tr>
      <td><xsl:value-of select="a"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="b"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="c"/></td>
    </tr>
    <tr>
      <td><xsl:value-of select="d"/></td>
    </tr>


  </table>
</xsl:for-each>

  </body>

 </html>

  </xsl:template>

</xsl:stylesheet>

当我使用ubuntu时,我选择氧气进行xml编辑。转换是成功的,但我的HTML中没有显示任何内容。我想我的问题与xml架构有关。使用Rad雷克萨斯解决方案后,问题仍然存在。

1 个答案:

答案 0 :(得分:3)

您的专线<xsl:for-each select="catalog/Qstr"> 已经将活动路径指向/catalog/Qstr/。因此,您不得在for-each.. select="catalog/Qstr/a"重复此内容 - 累积路径将变为

/catalog/Qstr/catalog/Qstr/a

使用它就足够了:

<td><xsl:value-of select="text" /></td>

(和其他value-of相同)。