如何使用模板多个但相同的部分?

时间:2014-01-08 11:06:57

标签: xml xslt

我的问题与链接How to get attribute name and its value properly?有关。根据Tim的建议,我将单独提出这个问题。我想分别显示每个目录信息。当前XSLT文件显示一个目录的结果。那么我应该对所有目录进行哪些更改将用于所有目录并分别显示每个目录信息,请检查xml文件。

我试过

<xsl:apply-templates select="directory/*" />

和许多其他选项但没有得到结果。

输入XML

  <?xml version="1.0" encoding="utf-8" ?>
    <root>
      <Directory name="1">
        <Software>
          <MS version="5.2.3.1"/>
          <Java version="5.1.0.29" />
          <Oracle id="A" version="1.0.1.11" />
          <SQL id="P" version="1.0.1.11" />
        </Software> 
      </Directory>
      <Directory name="2">
        <Software>
          <MS version="5.2.3.1"/>
          <Java version="5.1.0.29" />
          <Oracle id="A" version="1.0.1.11" />
          <SQL id="P" version="1.0.1.11" />
        </Software>
      </Directory>
      <Directory name="3">
        <Software>
          <MS version="5.2.3.1"/>
          <Java version="5.1.0.29" />
          <Oracle id="A" version="1.0.1.11" />
          <SQL id="P" version="1.0.1.11" />
        </Software>
      </Directory>
      ..........
    </root>

XSLT文件:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes" />
  <xsl:key name="columns" match="@*" use="local-name()" />
  <xsl:variable name="columns" select="//@*[generate-id() = generate-id(key('columns', local-name())[1])]" />
  <xsl:template match="/">
    <xsl:for-each select="//Directory">
      <table>
        <tr>
          <td>Software</td>
          <xsl:for-each select="$columns">
            <xsl:sort select="local-name()" />
            <td>
              <xsl:value-of select="local-name()" />
            </td>
          </xsl:for-each>
        </tr>
        <xsl:apply-templates select="*" />
      </table>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="Software/*">
    <tr>
      <td>
        <xsl:value-of select="local-name()" />
      </td>
      <xsl:variable name="attributes" select="@*" />
      <xsl:for-each select="$columns">
        <xsl:sort select="local-name()" />
        <td>
          <xsl:value-of select="$attributes[local-name() = local-name(current())]" />
        </td>
      </xsl:for-each>
    </tr>
  </xsl:template>
</xsl:stylesheet>

0 个答案:

没有答案