Замените уникальную строку символов на <xml>Теги в приборе xslt - PullRequest
0 голосов
/ 01 марта 2020

У меня есть сообщение xml - созданное довольно базовым c XML писателем (оно не повторяет повторяющиеся записи при определенных обстоятельствах) - это означает, что у нас есть текстовая строка, которая по необходимости содержит отдельные текстовые блоки , В инструменте XML мы смогли написать одну очень длинную текстовую строку, но мы смогли добавить индикаторы конца строки / новой строки. (TXNNTX, но может быть чем угодно, кроме тега xml). Будучи строкой, ее можно найти в любом месте файла XML.

Строка будет:

<causale>This is text that we need in line one TXNNTX We then need test to follow again that may have something important to say TXNNTX Then another line which is longer and longer and longer and longer and longer and longer and longer TXNNTX The maybe shorter TXNNTX or dots TXNNTX .............................................................................</causale>

Нам нужно чтобы найти TXNNTX и заменить его таким образом, чтобы вывод получился (новые строки только для иллюстрации):

<causale>This is text that we need in line one </causale>
<causale> We then need test to follow again that may have something important to say </causale>
<causale> Then another line which is longer and longer and longer and longer and longer and longer and longer </causale>
<causale> The maybe shorter </causale>
<causale> or dots </causale>
<causale> .............................................................................</causale>

Количество символов может быть до 2000 символов, долго пытались использовать несколько различных сценариев, но либо потому, что мы "<" "> изнутри, кажется, запутал мои основы c гр asp сценариев

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Это можно сделать очень просто в XSLT 2.0 или выше с помощью функции tokenize():

<xsl:for-each select="tokenize(causale, 'TXNNTX')">
    <causale>
        <xsl:value-of select="."/>
    </causale>
</xsl:for-each>

Если вы ограничены XSLT 1.0, проверьте, поддерживает ли ваш процессор EXSLT str:split() функция расширения. Если нет, используйте рекурсивный шаблон, как показано здесь , например.

0 голосов
/ 01 марта 2020

Используя XSLT 3, вы можете передать результат функции analyze-string в for-each-group group-ending-with:

<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"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:output indent="yes"/>

  <xsl:param name="marker" as="xs:string">TXNNTX</xsl:param>

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

  <xsl:template match="causale">
      <xsl:for-each-group select="analyze-string(., $marker)/*" group-ending-with="fn:match">
          <causale>
              <xsl:value-of select="current-group()[not(self::fn:match)]"/>
          </causale>
      </xsl:for-each-group>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/94Acsmp

Или обработать Результат функции с другим режимом:

<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"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:output indent="yes"/>

  <xsl:param name="marker" as="xs:string">TXNNTX</xsl:param>

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

  <xsl:mode name="wrap" on-no-match="shallow-skip"/>

  <xsl:template match="causale">
      <xsl:apply-templates select="analyze-string(., $marker)" mode="wrap"/>
  </xsl:template>

  <xsl:template mode="wrap" match="fn:non-match">
      <causale>
          <xsl:apply-templates/>
      </causale>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/94Acsmp/1

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