如何用xslt表示xml的嵌套元素?

时间:2013-01-21 09:25:42

标签: xslt

这是我需要从中生成xslt的xml数据。

<root>
    <entry id="1">
         <headword>go</headword>
         <example>I <hw>go</hw> to school.</example>
    </entry>
    <entry id="2">
         <headword>come</headword>
         <example>I <verb>came</verb> back home.</example>           
    </entry>

我想创建一个像这样的HTML:

<html>
     <body>
          <div class="entry" id="1">
                <span class="headword">go</span>
                <span class="example">I <span class="hw">go</span> to school.</span>
          </div>
          <div class="entry" id="2">
                <span class="headword">comeo</span>
                <span class="example">I <span class="hw">came</span> back home.</span>
          </div>
     </body>
</html>

这是我的xslt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <html>
            <body>
                <xsl:for-each select="root/entry">
                    <div class="entry">
                        <span class="headword">
                            <xsl:value-of select="headword"/>
                        </span>
                        <span class="example">
                            <xsl:value-of select="example"/>
                        </span>
                    </div>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

我不知道如何转换属性“id”的值和元素“hw”。

1 个答案:

答案 0 :(得分:1)

请试一试。我假设您的示例输出中的第二个class="hw"是一个拼写错误,应该是class="verb",因为这是唯一有意义的可能性:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates select="root/entry" />
      </body>
    </html>
  </xsl:template>

  <xsl:template match="entry">
    <div class="entry" id="{@id}">
      <xsl:apply-templates select="*" mode="entryContents" />
    </div>
  </xsl:template>

  <xsl:template match="*" mode="entryContents">
    <span class="{local-name()}">
      <xsl:apply-templates select="node()" mode="entryContents" />
    </span>
  </xsl:template>
</xsl:stylesheet>