2015-03-13 4 views
0

Я пытаюсь получить древовидное представление XML-файла с использованием XSLT и css. У меня есть вложенные дети в xml, и я повторяю их, чтобы отображать содержимое каждой записи.Как установить маржу динамически на XSLT

Каждый ребенок является регистратором с сообщениями. Я бы хотел, чтобы каждый дочерний стол был отступом в соответствии с подсчетом предка, который я получаю правильно. однако попытка установить поле таблицы динамически 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 до 'числа предков' и добавление продолжительности или дел. Я попытался нажать содержимое первой строки. для меня ничего не работает.

Любая помощь была бы принята с благодарностью!

ответ

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

спасибо большое! Я не могу поверить, что потратил столько времени на встроенные атрибуты вместо использования стиля! вы спаситель! – Roussul

Смежные вопросы