2017-02-13 9 views
0

Можно ли преобразовать текстовый файл в xml с помощью xslt. Я знаю, что мы можем сделать из xml в текст, который я сделал ранее. Но у нас есть текстовый файл, который должен быть структурирован XML с помощью XSLTТекст в xml с использованием xslt

Возможно ли это

UPDATE: (ниже это текстовый файл, который мне нужно разобрать, как XML)

C0707:00addd  abcde 
C0707:00tdef  ghidd 
C0715:00abcd  fghi 

XML :

<b1> 
<time>0707</time> 
<text>addd</text> 
<text2>abcde</text2> 
<text>tdef</text> 
<text2>ghid</text2> 
</b1> 

<b1> 
<time>0715</time> 
<text>abcd</text> 
<text2>fghi</text2> 
</b1> 
+0

Я смущен этим вопросом, ASCII - это просто набор символов, XML обычно использует набор символов ASCII в любом случае .... – SaggingRufus

+0

Так что это невозможно, как вы сказали. – user726720

+0

У нас был текстовый файл asci, который нужно было структурировать как xml, поэтому я подумал, что, возможно, был выход из xslt вместо того, чтобы его скриптировать. – user726720

ответ

3

Вот один пример, используя xsl:unparsed-text.

Вы не объясняете логику того, как каждый элемент разбит, поэтому я пошел с форматом типа «фиксированного поля». Это можно легко изменить, но должно быть хорошим примером, чтобы вы начали.

ввода текста (so.txt)

C0707:00addd  abcde 
C0707:00tdef  ghidd 
C0715:00abcd  fghi 

XSLT 2.0 (первоначальный шаблон должен быть установлен в text2xml)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="txt-encoding" as="xs:string" select="'iso-8859-1'"/> 
    <xsl:param name="txt-uri" as="xs:string" 
    select="'file:///C:/Some/path/so.txt'"/> 

    <xsl:template match="/" name="text2xml"> 
    <xsl:variable name="txt" select="unparsed-text($txt-uri, $txt-encoding)"/> 
    <xsl:variable name="entries" as="node()*"> 
     <xsl:analyze-string select="$txt" regex="\r\n?|\n"> 
     <xsl:non-matching-substring> 
      <xsl:analyze-string select="." regex="^C(.{{4}}):00(.{{9}})(.*)"> 
      <xsl:matching-substring> 
       <entry> 
       <time><xsl:value-of select="regex-group(1)"/></time> 
       <text><xsl:value-of select="normalize-space(regex-group(2))"/></text> 
       <text2><xsl:value-of select="normalize-space(regex-group(3))"/></text2> 
       </entry> 
      </xsl:matching-substring> 
      </xsl:analyze-string> 
     </xsl:non-matching-substring> 
     </xsl:analyze-string>  
    </xsl:variable> 
    <results> 
     <xsl:for-each-group select="$entries" group-by="time"> 
     <b1> 
      <xsl:copy-of 
      select="current-group()[1]/time,current-group()/*[not(self::time)]"/> 
     </b1> 
     </xsl:for-each-group>  
    </results> 
    </xsl:template> 

</xsl:stylesheet> 

Выход

<results> 
    <b1> 
     <time>0707</time> 
     <text>addd</text> 
     <text2>abcde</text2> 
     <text>tdef</text> 
     <text2>ghidd</text2> 
    </b1> 
    <b1> 
     <time>0715</time> 
     <text>abcd</text> 
     <text2>fghi</text2> 
    </b1> 
</results> 
+0

, когда я запускаю ваш пример в visual studio, чтобы понять код, я получаю эту ошибку: данные на корневом уровне недействительны. Строка 1, позиция 1. Есть ли у вас какая-либо подсказка – user726720

+0

@ user726720 - Это ошибка против XSLT? Это похоже на то, что вы пытаетесь использовать текстовый файл для ввода XSLT, который не будет работать. (Вот почему вам нужно указать начальный шаблон, нет фактического ввода.) Кроме того, какой процессор вы используете в Visual Studio? Вам понадобится процессор 2.0. –

+0

извините, я просто новичок в версии 2.0. Можете ли вы предложить редактор для этого. Вероятно, Visual Studio, похоже, поддерживает только 1.0 – user726720

0

Да, в текстовый файл можно преобразовать произвольный текстовый файл. Вам понадобится процессор XSLT 2.0 или более поздний.

Вам необходимо использовать функции unparsed-text, которые доступны в вашем анализаторе XSLT. Они позволяют читать в файле, который по существу является строковым результатом. Оттуда у вас есть несколько вариантов синтаксического анализа строки.

Этот вопрос касается преобразования текстового файла HL7 в XML: Converting and HL7 segment to XML. Пример преобразует текстовый файл, разделенный символами, в файл XML, используя tokenize(), чтобы выполнить грубый синтаксический анализ.

Я использовал для этого несколько вариаций, например, используя tokenize() для разбивки строк или абзацев, регулярных выражений, чтобы разбить части строк и т. Д. В общем, это не стоит для общего текста синтаксический анализ, поскольку время синтаксического анализа на порядок медленнее, чем даже сценарий оболочки. Вы можете рассмотреть возможность предварительной обработки вашего текстового файла во что-то, что XSLT может найти более приемлемым.

+1

'unparsed-text()' требует XSLT 2.0. –

+1

Ваш связанный вопрос не имеет ничего общего с преобразованием текста в XML. –

+0

Вы не знаете, как разобрать текст в xml. Я редактировал свой вопрос, чтобы дать пример текстового файла – user726720

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