В XSLT Tokenize все значения, кроме тех, которые заключены в кавычки - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь токенизировать строку в XML, которая имеет значения, разделенные запятыми. На котором я пользовался,

<xsl:variable name="lineField" select="tokenize(tag,',')" />

Это работает нормально, пока я не заметил, что значения суммы на 4-й, 5-й, 6-й позиции были обрезаны или токенизированы, что неправильно для моего намерения.

Ниже приведен пример строки в файле CSV, в котором 6 значений разделены 5 запятыми Суммы заключены в кавычки

, , Amount Paid,"133,654.70 ","9,356.10 ","124,298.60 "

tokenize(tag,',') приводит к 9 элементам в массиве вместо 6

lineField[] = {'','','AmountPaid','133','654.70','9','356.10','124','298.60'};

133 было разделено с " 133 , 654,70"

9 было разделено с " 9 , 356,10"

124 было разделено с " 124 , 298.60"

что не так.

Как я могу токенизировать все значения в строке, кроме тех, которые заключены в кавычки? Я не могу найти способ.

Буду признателен за любую помощь.

Спасибо.

1 Ответ

0 голосов
/ 05 июня 2019

Как упомянул Мартин Хоннен в комментариях, вам нужно использовать analyze-string здесь, чтобы сопоставить различные поля.

После некоторых проб и ошибок я придумал это

<xsl:template match="tag">
  <xsl:copy>
    <xsl:analyze-string select="concat(., ',')" regex='(("[^"]*")|([^,"]*)),'>
      <xsl:matching-substring>
        <field>
          <xsl:value-of select="replace(regex-group(1), '&quot;', '')" />
        </field>
      </xsl:matching-substring>
    </xsl:analyze-string>
  </xsl:copy>
</xsl:template>

Или, используя переменную ....

<xsl:template match="tag">
  <xsl:copy>
    <xsl:variable name="fields" select="analyze-string(concat(., ','), '((&quot;[^&quot;]*&quot;)|([^,&quot;]*)),')/*:match/*:group/replace(., '&quot;', '')"  />
    <xsl:for-each select="$fields">
      <field>
        <xsl:value-of select="." />
      </field>
    </xsl:for-each>
  </xsl:copy>
</xsl:template>

Обратите внимание, что в группу регулярных выражений входят любые кавычки, которые разделяют поля, поэтому используется replace. Предполагается, что кавычки используются только для разделения полей с запятыми и больше не отображаются, например, в середине обычного текстового поля (если они есть, возможно, вы входите в мир боли ....).

...