如何在XSLT上动态设置边距

时间:2015-03-13 19:03:27

标签: css xml xslt

我正在尝试使用XSLT和css实现xml文件的树视图。 我在xml中嵌套了子项,我正在迭代它们以显示每个条目的内容。

每个孩子都是一个带有消息条目的记录器。我想让每个子表根据我得到的祖先计数缩进。但是试图动态设置表边距margin-left =“$ margin * 10”不起作用。

这是我的XSLT / xml

<xsl:template match="operationLogger">
    <xsl:variable name="margin" select="count(ancestor::*) * 10"/>
      <table class="normalTable" cols="4">
        <xsl:attribute name="margin-left">
          <xsl:value-of select="$margin"/>
        </xsl:attribute>
        <tr class="errorsCollectionTitle">
          <td colspan="4">
            <xsl:value-of select="@name"/>
          </td>
        </tr>
        <xsl:if test="operationLogEntry">
          <xsl:apply-templates select="operationLogEntry"/>
        </xsl:if>
        <xsl:if test="operationLogger">
          <xsl:apply-templates select="operationLogger"/>
        </xsl:if>
      </table>
  </xsl:template>

  <xsl:template match="operationLogEntry">
    <tr>
      <xsl:attribute name="class">
        <xsl:choose>
          <xsl:when test="position() mod 2 = 1">rowData</xsl:when>
          <xsl:otherwise>rowAlternatingData</xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>
      <td>
        <xsl:attribute name="class">
          <xsl:choose>
            <xsl:when test="@level = 'Error'">errorImage</xsl:when>
            <xsl:when test="@level = 'Warning'">warningImage</xsl:when>
            <xsl:when test="@level = 'Info'">informationImage</xsl:when>
            <xsl:when test="@level = 'Debug'">informationImage</xsl:when>
          </xsl:choose>
        </xsl:attribute>
      </td>
      <td class="timeStamp">
        <xsl:value-of select="@timeStamp"/>
      </td>
      <td class="source">
        <xsl:value-of select="../loggerSource/@computer" />
        /
        <xsl:value-of select="../loggerSource/@user" />
      </td>
      <td class="message">
          <div>
        <xsl:attribute name="class">
            <xsl:choose>
              <xsl:when test="@level = 'Error'">errorColor</xsl:when>
              <xsl:when test="@level = 'Warning'">warningColor</xsl:when>
              <xsl:when test="@level = 'Info'">informationColor</xsl:when>
              <xsl:when test="@level = 'Debug'">informationColor</xsl:when>
            </xsl:choose>
          </xsl:attribute>
          <xsl:value-of select="@message"/>
        </div>
      </td>
    </tr>
  </xsl:template>
<operationLogger name="">
      <loggerSource domain="user" computer="computer" user="account" />
      <operationLogEntry timeStamp="2015/02/16 07:15:21" level="Info" message="Adding 1 to transactions list" />
      <operationLogEntry timeStamp="2015/02/16 07:15:21" level="Info" message="Executing 1 transactions..." />
      <operationLogEntry timeStamp="2015/02/16 07:15:22" level="Info" message="Executed 1 transactions successfully!" />
      <operationLogger name="TransactionOperationCollection.Execute()">
        <loggerSource domain="user" computer="computer" user="account" />
        <operationLogEntry timeStamp="2015/02/16 07:15:21" level="Info" message="Commiting transaction 0:Transaction" />
        <operationLogEntry timeStamp="2015/02/16 07:15:22" level="Info" message="Committed transaction 0:Transaction" />
        <operationLogger name="TransactionOperation.Commit()">
        <operationLogEntry timeStamp="2015/02/16 07:15:22" level="Info" message="Setting Auditonly" />
          <operationLogEntry timeStamp="2015/02/16 07:15:22" level="Info" message="Succesfully changed Audit Only" />
        </operationLogger>
      </operationLogger>
    </operationLogger>

我尝试从1循环到'祖​​先数'并添加span或div。我试着推送第一行的内容。似乎没有什么对我有用。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

没有margin-left属性。不过,您可以使用style属性:

<xsl:attribute name="style">
    <xsl:value-of select="concat('margin-left: ', $margin, 'px;')"/>
</xsl:attribute>

但使用内联样式很少是件好事。我建议你把表放在ul / li层次结构中。这样,您可以将边距放在CSS文件/ <style>部分中,而不是动态计算它们:

<xsl:template match="/">
  <ul>
    <xsl:apply-templates />
  </ul>
</xsl:template>     

<xsl:template match="operationLogger">
  <li>
    <table class="normalTable" cols="4">
      <tr class="errorsCollectionTitle">
        <td colspan="4">
          <xsl:value-of select="@name"/>
        </td>
      </tr>
      <xsl:apply-templates select="operationLogEntry"/>
    </table>
    <xsl:if test="operationLogger">
      <ul>
        <xsl:apply-templates select="operationLogger"/>
      </ul>
    </xsl:if>
  </li>
</xsl:template>