使用 xslt 将文本转换为 xml

use*_*720 1 xml xslt ascii

是否可以使用 xslt 将文本文件转换为 xml。我知道我们可以从 xml 到文本,就像我之前所做的那样。但是我们有一个文本文件,需要使用 xslt 将其构造为 xml

这可能吗

更新:(下面是我需要解析为 xml 的文本文件)

C0707:00addd     abcde
C0707:00tdef     ghidd 
C0715:00abcd     fghi
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Dan*_*ley 5

这是一个使用 的示例xsl:unparsed-text

您没有解释每个项目如何分解的逻辑,所以我采用了“固定字段”类型格式。这可以很容易地改变,但应该是一个很好的例子来帮助你开始。

文本输入(so.txt)

C0707:00addd     abcde
C0707:00tdef     ghidd 
C0715:00abcd     fghi
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

输出

<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>
Run Code Online (Sandbox Code Playgroud)