0

この XSLT の実現に問題があります。次の XML から HTML テーブルを作成する必要があります。

<?xml version="1.0" encoding="ISO-8859-1"?>
<Overview>
<Header>
    <Column name="SysRepositoryLabel_Language" width="10%" align="center">Lingua</Column>
    <Column name="SysRepositoryLabel_Text" width="45%" align="left">Testo</Column>
    <Column name="SysRepositoryLabel_Usage" width="45%" align="left">Uso</Column>
</Header>
<Rows>
  <Row row="0">
    <Column name="SysRepositoryLabel_PKey">1</Column>
    <Column name="SysRepositoryLabel_Language">it</Column>
    <Column name="SysRepositoryLabel_Text">Accedi al Sistema</Column>
    <Column name="SysRepositoryLabel_Usage">AppMenuLabelLogIn</Column>
  </Row>
  <Row row="1">
    <Column name="SysRepositoryLabel_PKey">2</Column>
    <Column name="SysRepositoryLabel_Language">en</Column>
    <Column name="SysRepositoryLabel_Text">LogIn</Column>
    <Column name="SysRepositoryLabel_Usage">AppMenuLabelLogIn</Column>
  </Row>
  <Row row="2">
    <Column name="SysRepositoryLabel_PKey">3</Column>
    <Column name="SysRepositoryLabel_Language">it</Column>
    <Column name="SysRepositoryLabel_Text">Archivio</Column>
    <Column name="SysRepositoryLabel_Usage">AppMenuLabelMasterData</Column>
  </Row>
</Rows>
</Overview>

これは私が取得したいテーブルです:

<table width="100%" cellpadding="0" cellspacing="0" border="0>
  <tr>
    <td width="10%" align="center" valign="center">Lingua</td>
    <td width="45%" align="left" valign="center">Testo</td>
    <td width="45%" align="left" valign="center">Uso</td>
  </tr>
</table>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
  <tr>
    <td width="10%" align="center" valign="center">it</td>
    <td width="45%" align="left" valign="center">Accedi al Sistema</td>
    <td width="45%" align="left" valign="center">AppMenuLabelLogIn</td>
  </tr>
  <tr>
    <td width="10%" align="center" valign="center">en</td>
    <td width="45%" align="left" valign="center">LogIn</td>
    <td width="45%" align="left" valign="center">AppMenuLabelLogIn</td>
  </tr>
  <tr>
    <td width="10%" align="center" valign="center">it</td>
    <td width="45%" align="left" valign="center">Archivio</td>
    <td width="45%" align="left" valign="center">AppMenuLabelMasterData</td>
  </tr>
</table>

ノード ヘッダーでは、この新しいテーブルの列数と、テキストの幅とアリングとしていくつかのプロパティを使用して、テーブルのヘッダーを作成する必要があります。ノード Rows I have the data to put the tables では、行数はヘッダーの行数よりも多くする必要がありますが、ヘッダーに存在するものだけを 2 番目のテーブルにもエクスポートする必要があります。

どうもありがとうパスクアーレ

4

2 に答える 2

1

次に示すのは、Header/Column 要素で満たされた thead を持つ 1 つのテーブルと、Rows/Row 要素で設定された tbody が必要であると仮定したサンプルです。そして、for-each ではなく、テンプレートを使用します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:strip-space elements="*"/>
  <xsl:output method="html" indent="yes"/>

  <xsl:variable name="cols" select="/Overview/Header/Column"/>

  <xsl:template match="Overview">
    <table width="100%" cellpadding="0" cellspacing="0" border="0">
      <xsl:apply-templates select="$cols" mode="cols"/>
      <thead>
        <tr>
          <xsl:apply-templates select="$cols"/>
        </tr>
      </thead>
      <tbody>
        <xsl:apply-templates select="Rows/Row"/>
      </tbody>
    </table>
  </xsl:template>

  <xsl:template match="Header/Column" mode="cols">
    <col width="{@width}" align="{@align}" valign="center"/>
  </xsl:template>

  <xsl:template match="Header/Column">
    <th>
      <xsl:value-of select="."/>
    </th>
  </xsl:template>

  <xsl:template match="Row">
    <tr>
      <xsl:apply-templates select="Column[@name = $cols/@name]"/>
    </tr>
  </xsl:template>

  <xsl:template match="Row/Column">
    <td>
      <xsl:value-of select="."/>
    </td>
  </xsl:template>

</xsl:stylesheet>

Saxon 6.5.5、投稿した入力に対してそのスタイルシートを実行すると、出力

<table width="100%" cellpadding="0" cellspacing="0" border="0">
   <col width="10%" align="center" valign="center">
   <col width="45%" align="left" valign="center">
   <col width="45%" align="left" valign="center">
   <thead>
      <tr>
         <th>Lingua</th>
         <th>Testo</th>
         <th>Uso</th>
      </tr>
   </thead>
   <tbody>
      <tr>
         <td>it</td>
         <td>Accedi al Sistema</td>
         <td>AppMenuLabelLogIn</td>
      </tr>
      <tr>
         <td>en</td>
         <td>LogIn</td>
         <td>AppMenuLabelLogIn</td>
      </tr>
      <tr>
         <td>it</td>
         <td>Archivio</td>
         <td>AppMenuLabelMasterData</td>
      </tr>
   </tbody>
</table>
于 2012-06-23T17:08:18.230 に答える
0

これは私が今夜見つけた解決策です;)

<xsl:variable name="Cols" select="Overview/Header/Column"/>

...

<xsl:for-each select="Column[@name = $Cols//@name]">
<td valign="center">
<xsl:variable name="CurrentCol" select="@name"/>
<xsl:for-each select="$Cols[@name = $CurrentCol]">
<xsl:attribute name="width"><xsl:value-of select="@width" /></xsl:attribute>
<xsl:attribute name="align"><xsl:value-of select="@align" /></xsl:attribute>
</xsl:for-each>
<xsl:value-of select="."/>
</td>
</xsl:for-each>

問題の焦点を失う可能性がある多くの機能を追加したため、すべてのコードを投稿するわけではありません。しかし、このコードでは、ノード ROW の列をノード HEADER の同じ列でフィルタリングし、ヘッダー ノードのプロパティ (幅、整列) も維持することができました...

于 2012-06-24T10:06:06.513 に答える