2016-12-19 8 views
-1

Я немного новичок в этом языке, поэтому у меня есть несколько сомнений. Я работаю над обработкой xml для отображения некоторых данных в формате pdf. Но есть несколько строк, которые имеют «|» поэтому я могу разделить данные для правильного отображения. Вот пример входных данных:Разделить строку на "|" Char для столбцов

<root> 
    <reference> 
    <NroLinRef>12</NroLinRef> 
    <CodRef>I20</CodRef> 
    <RazonRef>Data1|Data2|Data3|Data4|Data5|Data6|Data7</RazonRef> 
    </reference> 
</root> 

В выходных данных мне нужно что-то подобное, так что я может отображать в порядке, в строке с клетками, так что данные должны быть понятны для чтения.

<root> 
    <Reference> 
    <NroLinRef>12</NroLinRef> 
    <CodRef>I20</CodRef> 
    <Data1>Data1</Data1> 
    <Data2>Data2</Data2> 
    <Data3>Data3</Data3> 
    <Data4>Data4</Data4> 
    <Data5>Data5</Data5> 
    <Data6>Data6</Data6> 
    <Data7>Data7</Data7> 
    </Reference> 
</root> 

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

И выход я на самом деле так:

<root> 
    <Reference> 
    <NroLinRef>12</NroLinRef> 
    <CodRef>I20</CodRef> 
    <Data>Data1</Data> 
    <Data>Data2</Data> 
    <Data>Data3</Data> 
    <Data>Data4</Data> 
    <Data>Data5</Data> 
    <Data>Data6</Data> 
    <Data>Data7</Data> 
    </Reference> 
</root> 

Это XSL я использую

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:template match="@*|node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:copy> 
     </xsl:template> 
     <xsl:template match="Referencia/RazonRef" name="tokenize"> 
      <xsl:param name="text" select="."/> 
      <xsl:param name="separator" select="'|'"/> 
      <xsl:choose> 
       <xsl:when test="not(contains($text, $separator))"> 
        <Data> 
         <xsl:value-of select="normalize-space($text)"/> 
        </Data> 
       </xsl:when>   
       <xsl:otherwise> 
        <Data> 
         <xsl:value-of select="normalize-space(substring-before($text, $separator))"/> 
        </Data> 
        <xsl:call-template name="tokenize"> 
         <xsl:with-param name="text" select="substring-after($text, $separator)"/> 
        </xsl:call-template> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:template> 
    </xsl:stylesheet> 

Как я могу получить выход я хочу?

+0

Если вы уже получаете результат, я не понимаю, что вы просите здесь .... что вы подразумеваете под обновлением/настройкой? – Aify

+4

** 1. ** Пожалуйста, разместите текущую таблицу стилей XSLT, чтобы мы могли ее изменить, вместо того, чтобы писать код для вас с нуля. ** 2 ** Вы уверены, что хотите формат, который вы показываете? это не хороший формат XML. –

+0

Позвольте мне подробнее объяснить проблему, я создал и xml, которые нужно использовать в 2 разных файлах для вывода, из-за этого у меня есть эта строка, разделенная witn "|" он работает без проблем в одном формате, который является PDF для отображения данных, проблема y, когда мне нужно отображать одни и те же данные с помощью xslt. – rororuz

ответ

0

Ожидаемый результат может быть достигнут путем применения следующих стилей:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="RazonRef" name="tokenize"> 
    <xsl:param name="text" select="."/> 
    <xsl:param name="separator" select="'|'"/> 
    <xsl:param name="i" select="1"/> 
    <xsl:element name="Data{$i}"> 
     <xsl:value-of select="substring-before(concat($text, $separator), $separator)"/> 
    </xsl:element> 
    <xsl:if test="contains($text, $separator)"> 
     <xsl:call-template name="tokenize"> 
      <xsl:with-param name="text" select="substring-after($text, $separator)"/> 
      <xsl:with-param name="i" select="$i + 1"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

 Смежные вопросы

  • Нет связанных вопросов^_^