XSLT сортировать или группировать? - PullRequest
2 голосов
/ 08 марта 2011

У меня есть следующий XML-файл:

<DATABLOCK>
    <LINE>
        <DATA>010000</DATA>
        <DATA>User1@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>-0</CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User1@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>-0</CREDIT>
    </LINE>
    <LINE>
        <DATA>010002</DATA>
        <DATA>User3@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>0</CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User3@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>-0</CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User3@MSAD</DATA>
        <DATA>User2@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>0</CREDIT>
    </LINE>
    <LINE>
        <DATA>010003</DATA>
        <DATA>User4@MSAD</DATA>
        <DATA>User5@MSAD</DATA>
        <DEBIT></DEBIT>
        <CREDIT>640,650</CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User4@MSAD</DATA>
        <DATA>User5@MSAD</DATA>
        <DEBIT>567,103</DEBIT>
        <CREDIT></CREDIT>
    </LINE>
    <LINE>
        <DATA></DATA>
        <DATA>User4@MSAD</DATA>
        <DATA>User5@MSAD</DATA>
        <DEBIT>73,547</DEBIT>
        <CREDIT></CREDIT>
    </LINE>
</DATABLOCK>

Этот файл - выходной файл, для которого я не могу легко изменить, потребуется больше времени, чтобы выяснить кодировку, которая создает данные XML, чем созданиеизмененный формат отображения.Данные представляют собой отчет журналов со значениями в узлах DATA, равными номеру журнала, утвержденному, проведенному дебетовой суммой, суммой кредита.Я отредактировал файл XSL стандартного отчета следующим образом:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
    <h1>Posted Journals:</h1>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Journal</th>
        <th>Approved By</th>
        <th>Posted By</th>
      </tr>
      <xsl:for-each select="DATABLOCK/LINE">
      <tr>
                <xsl:for-each select="DATA">
                        <TD><xsl:value-of select="."/></TD>
                </xsl:for-each>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>

Моя проблема заключается в игнорировании последующей строки, где первый элемент данных пуст.Я не нуждаюсь в дебете или кредите, поэтому мой желаемый результат таков:

Journal Approved By Posted By
010000     User1@MSAD    User2@MSAD
010002      User3@MSAD   User2@MSAD
010003      User4@MSAD   User5@MSAD

Я совершенно новичок в XSLT и нахожу фрагменты в Интернете, которые кажутся применимыми, но не полностью понимаютсинтаксис и как изменить его для моего сценария.

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Если они уже сгруппированы и отсортированы, то похоже, что вы можете просто визуализировать строки, имеющие значение для первого элемента DATA, и пропустить остальные:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />

<xsl:template match="DATABLOCK">
  <html>
  <body>
    <h1>Posted Journals:</h1>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Journal</th>
        <th>Approved By</th>
        <th>Posted By</th>
      </tr>
      <xsl:apply-templates />
    </table>
  </body>
  </html>
  </xsl:template>

  <!--Do not render LINEs that do not have a value for the first DATA element-->
  <xsl:template match="LINE[not(normalize-space(DATA[1]))]"/>

  <!--Each LINE element will be renderd as a Row-->
  <xsl:template match="LINE">
    <tr><xsl:apply-templates select="DATA"/></tr>
  </xsl:template>

  <!--Each DATA element will be a column -->
  <xsl:template match="DATA">
    <td><xsl:value-of select="."/></td>
  </xsl:template>
</xsl:stylesheet>
1 голос
/ 08 марта 2011

Просто измените условие для каждого на

<xsl:for-each select="DATABLOCK/LINE[not(DATA[1]/text()='')]">

Это ограничивает для каждого элемента обработку только строк, имеющих непустой текстовый узел в первом элементе DATA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...