【问题标题】:XSL for-each from different structureXSL for-each 来自不同的结构
【发布时间】:2012-06-25 15:09:27
【问题描述】:

我在实现这个 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>

在节点 Header 中,我必须使用这个新表的列数和一些属性作为表的标题,作为文本的宽度和 aling。 在节点行中,我有要放入表中的数据,行数应该多于表头之一,但只有表头中的当前值也应该导出到第二个表中。

非常感谢帕斯夸莱

【问题讨论】:

  • 您写了“这是我想要获得的表格”,但随后您发布了两个 HTML 表格的标记,而不是一个。请说明您要查找的输出。

标签: xml xslt variables foreach


【解决方案1】:

这是一个示例,假设您想要一个表,其中一个表头由 Header/Column 元素填充,然后是一个由 Rows/Row 元素填充的 tbody。而且我使用模板,而不是每个模板:

<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>

【讨论】:

  • 嗨,非常感谢您的支持,但不幸的是,这种解决方案对我不利,出于技术原因,我需要使用 for-each 来应用它,非常感谢
  • @user1477028:这根本不是“技术”原因。这是一个个人的原因,表明您需要学习 XSLT。 SO的主要目的是向专家学习,而您似乎不想学习。为 Martin Honnen 的好答案 +1。
  • 您好,我当然有很多关于 XSLT 的知识要学习,请记住我昨天是第一次开始学习。问题是使用 JQuery 来应用您的工作表没有考虑到:( 仅此。因此,由于我目前不是专家,我认为模板与您的模板之间存在很大差异一个带有 for-each 的简单 XSLT,我正在等待 8 小时后发布我的解决方案,因为我认为这个问题很容易解决,但我还不太了解 XSL 指针。非常感谢无论如何...
  • 嗨,这是您的代码中在我的代码中不起作用的部分,“Column[@name = $cols/@name]”,似乎属性 $cols/@name 是抛出一个错误,所以我的转换结果是一个空白页:(我把它放在一个 for-each 中:
【解决方案2】:

这是我今晚找到的解决方案;)

<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>

我不会发布所有代码,因为现在我添加了很多功能,这些功能可能会让我们失去问题的焦点。但是通过这段代码,我能够使用节点 HEADER 的相同列过滤节点 ROW 的列,同时维护标题节点的属性(宽度、对齐)...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2012-10-11
    • 1970-01-01
    • 2023-01-11
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多