XSLT 2.0 опция строки-анимации не работает? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть структура XML, как показано ниже

 <warning file="project\Src\a.c" line="45" message="intended 7.7. 3218 Decl File scope static, 'DSVS_SLOW_CH_RCVD_INFO_INIT', only accessed in one function."/>
 <warning file="project\Src\x.c" line="132" message="deviation 3218 Decl File scope static,">

Я хочу, чтобы строка файла и сообщение приходили в виде таблицы.Сообщение сопоставляется с регулярным выражением и должно быть принято.

Сообщение содержит ранг - (предполагаемый или отклонение) необязательный стандарт, правило и описание.и он разделен пробелом

В моем примере первый тег имеет file = project \ Src \ ac, line = 45, rank = предназначен, стандарт 7.7.Правило 3218 и описание = Decl Область действия файла ....

Во втором примере стандарт отсутствует.

Что мне нужно, так это вывод

<tr>
    <td>Filename</td>
    <td>Line</td>
    <td>Rank</td>
    <td>Coding Standard</td>
    <td>Rule</td>
    <td>Description</td>
</tr>
<tr>
    <td>project\Src\a.c </td>
    <td>45</td>
    <td>intended</td>
    <td>7.7.</td>
    <td>3218</td>
    <td>Decl File scope...</td>
</tr>
<tr>
    <td>project\Src\x.c </td>
    <td>132</td>
    <td>deviation</td>
    <td></td>
    <td>3218</td>
    <td>Decl File scope...</td>
</tr>

Что я пробовалпока что

<tr>
                <td>Filename</td>
                <td>Line</td>
                <td>Rank</td>
                <td>Standard</td>
                <td>Rule</td>
                <td>Description</td>
            </tr>
            <xsl:for-each select="issues/warning">
                <tr>
                <td><xsl:value-of select="@file"/></td>
                <td><xsl:value-of select="@line"/></td>
                </tr>
                <xsl:analyze-string select="@message"
                                    regex="\s*([intended|deviation])\s+(.*)\s+(\d+)\s+(.*)">
                    <xsl:matching-substring>
                        <tr>

                            <td><xsl:value-of select="regex-group(1)"/></td>
                            <td><xsl:value-of select="regex-group(2)"/></td>
                            <td><xsl:value-of select="regex-group(3)"/></td>
                            <td><xsl:value-of select="regex-group(4)"/></td>
                        </tr>

                    </xsl:matching-substring>

                    <xsl:non-matching-substring>
                        <tr>
                            <tr>
                                <td><xsl:value-of select="."/></td>
                            </tr>

                        </tr>

                    </xsl:non-matching-substring>

                </xsl:analyze-string>

            </xsl:for-each>

Но это не работает, как я ожидал.Ряды и значения смешиваются.Как определить, присутствует ли необязательный стандарт или нет?Любые советы по решению проблемы приветствуются.

1 Ответ

1 голос
/ 05 марта 2019

Я думаю, что вам может понадобиться выражение \s*(intended|deviation)\s+(.+\s+)?(\d+)\s+(.*) (обратите внимание на использование ? для случаев с нулем или одним)

Попробуйте это XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="/">
    <xsl:for-each select="issues/warning">
      <tr>
        <td><xsl:value-of select="@file"/></td>
        <td><xsl:value-of select="@line"/></td>
        <xsl:analyze-string select="@message"
                            regex="\s*(intended|deviation)\s+(.+\s+)?(\d+)\s+(.*)">
          <xsl:matching-substring>
            <td><xsl:value-of select="regex-group(1)"/></td>
            <td><xsl:value-of select="regex-group(2)"/></td>
            <td><xsl:value-of select="regex-group(3)"/></td>
            <td><xsl:value-of select="regex-group(4)"/></td>
          </xsl:matching-substring>
        </xsl:analyze-string>
      </tr>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

См. http://xsltfiddle.liberty -development.net / ncdD7mb

...