Как мы можем получить значение данных в виде перевода строки с помощью xslt - PullRequest
0 голосов
/ 13 декабря 2011

здесь я вставил образец xml 50G, раньше я использовал выборку данных из этого тега ниже с помощью crlf, но теперь я хочу получить с помощью перевода строки, потому что мне нужны данные правильно, что если я спрашиваю как предположим, я хочу, чтобы перевод строки 1 означал AE012345677890 аналогично перевод строки 2 означает, что он должен получить код банка с помощью xslt. Как я могу вызвать перевод строки.

<local>
        <message>
            <block4>

                <tag>
                    <name>50G</name>                     
            <value>AE012345677890
    Bank code
    country name
    country code</value>
                </tag>

            </block4>
        </message>
    </local>

Требуется вывод:

AE012345677890, код банка, название страны, код страны

Ответы [ 3 ]

0 голосов
/ 13 декабря 2011

Если вы используете XSLT 2.0, вы также можете сделать это с помощью функции tokenize:

<xsl:template match="value">
  <!-- loop through each segment that's before a line break, output 
       its normalised value and add a comma if required -->
  <xsl:for-each select="tokenize(., '&#10;')">
    <xsl:value-of select="normalize-space(current())"/>
    <xsl:if test="not(position()=last())">,</xsl:if>
  </xsl:for-each>
</xsl:template>

Это дает желаемый результат:

AE012345677890,Bank code,country name,country code 

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

Если вы ограничены XSLT 1.0, возможно, вы сможете реализовать библиотеку EXSLT, которая также содержит tokenize (см. Страницу tokenize и нажмите «How To» в верхнем левом меню для больше информации о реализации библиотеки).

0 голосов
/ 13 декабря 2011

В зависимости от пространства значений для различных типов компонентов (например, если известно, что они не содержат пробелов), может подойти вам одно из этих простых решений XSLT 1.0.

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

 <xsl:template match="value">
     <xsl:value-of select=
     "translate(., '&#10; &#9;&#13;', ',')"/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

Выдает

AE012345677890,Bankcode,countryname,countrycode

И это преобразование :

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

 <xsl:template match="value">
     <xsl:value-of select=
     "normalize-space(translate(., '&#10;', ','))"/>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

производит

AE012345677890, Bank code, country name, country code

Если ни одно из этих двух преобразований XSLT 1.0 не удовлетворяет вашим требованиям, вам может потребоваться выполнить операцию trim. Существует trim функция / шаблон в FXSL - готов к использованию.

II. Быстрое решение XSLT 2.0 :

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="value">
  <xsl:variable name="vLines" select="tokenize(., '&#xd;?&#xa;')"/>

  <xsl:for-each select="$vLines">
    <xsl:value-of select=
     "translate(replace(., '(^[ \t\r]+)|([ \t\r]+$)', '~~'), '~', '')"/>
     <xsl:if test="not(position() eq last())">,</xsl:if>
  </xsl:for-each>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

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

AE012345677890,Bank code,country name,country code
0 голосов
/ 13 декабря 2011

Это явно плохое использование XML. Суть XML в том, что вам не нужно никакого другого синтаксического анализа, и здесь вам нужен один, а именно разделение на новую строку. В любом случае, если у вас уже есть это, вы можете разделить на новую строку, используя основные функции XPath substring-before и substring-after.

Первая строка должна выглядеть примерно так:

substring-before(value, '&#10;')

(это выражение xpath, поэтому вы должны поместить его в или подобный тег), а остальные строки должны быть

substring-after(value, '&#10;')

Вы можете объединить эти два, поэтому вторая строка -

substring-before(substring-after(value, '&#10;'), '&#10;')

третья строка

substring-before(substring-after(substring-after(value, '&#10;'), '&#10;'), '&#10;')

и т.д.

PS: Я не уверен, нужно ли вам использовать &#10; или \n для перевода строки.

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