xsl:unparsed-text
を使用した1つの例です。
あなたはそれぞれのアイテムがどのように分割されているのかを説明していないので、私は「固定フィールド」タイプのフォーマットを使いました。これは簡単に変更することができますが、開始するにはokの例にする必要があります。
テキスト入力(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>
私はこの質問で混乱しています、ASCIIは単なる文字セットです、XMLは通常、ASCII文字セットをとにかく使っています.... – SaggingRufus
あなたは言ったようにそれはできません。 – user726720
xmlとして構造化する必要のあるasciテキストファイルがありましたので、スクリプト化の代わりにxsltを使用する方法があると思いました – user726720