11

次のような構造のプレーンテキストファイルがあります。

!ITEM_NAME
Item value
!ANOTHER_ITEM
Its value
...

次のようなファイルを XSLT で取得することは可能ですか。

<?xml version="1.0" encoding="UTF-8" ?>
<document>
  <ITEM_NAME>Item value</ITEM_NAME>
  <ANOTHER_ITEM>Its value</ANOTHER_ITEM>
  ...
</document>

編集

申し訳ありませんが、以前は明確に述べていませんでした。Visual Studio 2005 XSLT エンジンを使用してこの変換を実行しようとしています。提供された両方のソリューションを試しましたが、どちらも正しいと確信しています。しかし、Visual Studio 2005 は unparsed-text 関数を認識していません。

4

2 に答える 2

10

XSLT 2.0 を使用できる場合は、unparsed-text()...

テキスト ファイル(テキスト ファイルを XSLT への直接入力として使用しないでください。)

!ITEM_NAME
Item value
!ANOTHER_ITEM
Its value
!TEST_BANG
Here's a value with !bangs!!!

XSLT 2.0 (この XSLT をそれ自体に適用します (XML 入力としてスタイルシートを使用します。テキスト ファイルへのパスも変更する必要があります。エンコーディングも変更する必要がある場合があります。)

<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="text-encoding" as="xs:string" select="'iso-8859-1'"/>
    <xsl:param name="text-uri" as="xs:string" select="'file:///C:/Users/dhaley/Desktop/test.txt'"/>

    <xsl:template name="text2xml">
        <xsl:variable name="text" select="unparsed-text($text-uri, $text-encoding)"/>
        <xsl:analyze-string select="$text" regex="!(.*)\n(.*)">
            <xsl:matching-substring>
                <xsl:element name="{normalize-space(regex-group(1))}">
                    <xsl:value-of select="normalize-space(regex-group(2))"/>
                </xsl:element>
            </xsl:matching-substring>
        </xsl:analyze-string>
    </xsl:template>

    <xsl:template match="/">
        <document>
            <xsl:choose>
                <xsl:when test="unparsed-text-available($text-uri, $text-encoding)">
                    <xsl:call-template name="text2xml"/>                                
                </xsl:when>
                <xsl:otherwise>
                    <xsl:variable name="error">
                        <xsl:text>Error reading "</xsl:text>
                        <xsl:value-of select="$text-uri"/>
                        <xsl:text>" (encoding "</xsl:text>
                        <xsl:value-of select="$text-encoding"/>
                        <xsl:text>").</xsl:text>
                    </xsl:variable>
                    <xsl:message><xsl:value-of select="$error"/></xsl:message>
                    <xsl:value-of select="$error"/>
                </xsl:otherwise>
            </xsl:choose>
        </document>
    </xsl:template>
</xsl:stylesheet>

XML 出力

<document>
   <ITEM_NAME>Item value</ITEM_NAME>
   <ANOTHER_ITEM>Its value</ANOTHER_ITEM>
   <TEST_BANG>Here's a value with !bangs!!!</TEST_BANG>
</document>
于 2013-04-12T17:36:05.243 に答える
8

この 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:variable name="vText" select=
 "replace(unparsed-text('file:///c:/temp/delete/text.txt'),'\r','')"/>

 <xsl:template match="/">
  <document>
      <xsl:analyze-string select="$vText" regex="(!(.+?)\n([^\n]+))+">
       <xsl:matching-substring>
         <xsl:element name="{regex-group(2)}">
                <xsl:sequence select="regex-group(3)"/>
         </xsl:element>
       </xsl:matching-substring>
       <xsl:non-matching-substring><xsl:sequence select="."/></xsl:non-matching-substring>
      </xsl:analyze-string>
  </document>
 </xsl:template>
</xsl:stylesheet>

任意の XML ドキュメント (使用されていない) に適用され、提供されたテキストがローカル ファイルに存在する場合C:\temp\delete\Text.txt:

!ITEM_NAME
Item value
!ANOTHER_ITEM
Its value
...

必要な正しい結果が生成されます。

<document>
   <ITEM_NAME>Item value</ITEM_NAME>
   <ANOTHER_ITEM>Its value</ANOTHER_ITEM>
...
</document>

より完全にテストするために、次のテキストをファイルに入れます。

As is text
!ITEM_NAME
Item value
!ANOTHER_ITEM
Its value
As is text2
!TEST_BANG
Here's a value with !bangs!!!
!TEST2_BANG
 !!!Here's a value with !more~ !bangs!!!
As is text3

変換により、必要な正しい結果が再び生成されます。

<document>As is text
<ITEM_NAME>Item value</ITEM_NAME>
<ANOTHER_ITEM>Its value</ANOTHER_ITEM>
As is text2
<TEST_BANG>Here's a value with !bangs!!!</TEST_BANG>
<TEST2_BANG> !!!Here's a value with !more~ !bangs!!!</TEST2_BANG>
As is text3
</document>
于 2013-04-13T03:49:59.187 に答える