Как убрать запятую и '[]' вокруг строки в XSLT 2.0 - PullRequest
0 голосов
/ 05 марта 2019

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

Пример XML:

<VALUES>
   <VALUE>[example],[example1],[good,example],[test]</VALUE>
<VALUES>

XSLT:

    <xsl:template name="SimpleStringLoop">
    <xsl:param name="input"/>
    <xsl:if test="string-length($input) &gt; 0">
        <xsl:variable name="v" select="substring-before($input, ',')"/>
        <xsl:value-of select="$v"/>
        <xsl:call-template name="SimpleStringLoop">
            <xsl:with-param name="input" select="substring-after($input, ',')"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>

<xsl:template match="VALUE">
    <xsl:call-template name="SimpleStringLoop">
        <xsl:with-param name="input" select="."/>
    </xsl:call-template>
    <xsl:value-of select="substring-before(substring-after(.,'['),']')"/>
</xsl:template>

Ожидаемый результат:

<VALUES>
   <VALUE>example</VALUE>
   <VALUE>example1</VALUE>
   <VALUE>good,example</VALUE>
   <VALUE>test</VALUE>
<VALUES>

Мне удалось разделить запятыми. Я думаю, что также для каждого значения, считая запятые и создавая одинаковое количество элементов и записывая их, имеет смысл. Как избавиться от «[]» вокруг строк?

1 Ответ

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

Я бы использовал analyze-string, в XSLT 3 вы можете вызвать его как функцию XPath и просто обработать элементы XML fn:match, которые возвращает функция:

  <xsl:template match="VALUE">
      <xsl:apply-templates select="analyze-string(., '\[([^\[]+)\]')//fn:match"/>
  </xsl:template>

полный пример

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fn="http://www.w3.org/2005/xpath-functions"
    expand-text="yes"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:output indent="yes"/>

  <xsl:template match="VALUE">
      <xsl:apply-templates select="analyze-string(., '\[([^\[]+)\]')//fn:match"/>
  </xsl:template>

  <xsl:template match="fn:match">
      <VALUE>{fn:group[@nr = 1]}</VALUE>
  </xsl:template>

</xsl:stylesheet>

В XSLT 2 вместо этого можно использовать xsl:analyze-string, а затем использовать xsl:matching-substring внутри для вывода элемента VALUE:

  <xsl:template match="VALUE">
      <xsl:analyze-string select="." regex="\[([^\[]+)\]">
          <xsl:matching-substring>
              <VALUE>
                  <xsl:value-of select="regex-group(1)"/>
              </VALUE>
          </xsl:matching-substring>
      </xsl:analyze-string>
  </xsl:template>

http://xsltransform.net/pNEhB3b

...