我想从定义如下的XML文件中显示一组表:

<reportStructure>
  <table>
    <headers>
      <tableHeader>Header 1.1</tableHeader>
      <tableHeader>Header 1.2</tableHeader>
    </headers>
    <tuples>
      <tuple>
        <tableCell>1.1.1</tableCell>
        <tableCell>1.2.1</tableCell>
      </tuple>
      <tuple>
        <tableCell>1.1.2</tableCell>
        <tableCell>1.2.2</tableCell>
      </tuple>
    </tuples>
  </table>
  <table>
  ...


我正在使用XSLT和XPath转换数据,但是foreach无法按我期望的方式工作:

      <xsl:template match="reportStructure">
        <xsl:for-each select="table">
          <table>
            <tr>
              <xsl:apply-templates select="/reportStructure/table/headers"/>
            </tr>
            <xsl:apply-templates select="/reportStructure/table/tuples/tuple"/>
          </table>
        </xsl:for-each>
      </xsl:template>

      <xsl:template match="headers">
        <xsl:for-each select="tableHeader">
          <th>
            <xsl:value-of select="." />
          </th>
        </xsl:for-each>
      </xsl:template

      <xsl:template match="tuple">
        <tr>
          <xsl:for-each select="tableCell">
            <td>
              <xsl:value-of select="." />
            </td>
          </xsl:for-each>
        </tr>
      </xsl:template>


虽然我希望每个表标签输出一个表,但它会为每个表标签输出所有表头和单元格。

最佳答案

您正在apply-templates中选择所有标头和元组。

仅选择相关的:

  <xsl:template match="reportStructure">
    <xsl:for-each select="table">
      <table>
        <tr>
          <xsl:apply-templates select="headers"/>
        </tr>
        <xsl:apply-templates select="tuples/tuple"/>
      </table>
    </xsl:for-each>
  </xsl:template>


实际上,您也应该简单地将以上内容作为单个table模板,而不使用xsl:for-each

  <xsl:template match="table">
      <table>
        <tr>
          <xsl:apply-templates select="headers"/>
        </tr>
        <xsl:apply-templates select="tuples/tuple"/>
      </table>
  </xsl:template>

07-25 21:18