初心者の Perl プログラマー。単純な xml 文字列をタブ区切りのテキスト ファイルに変換しようとしています。XML::Parser (および XML::Twig/Simple、さらには XSLT) の使用に苦労しましたが、主要なデータ部分を列見出しにする方法がわかりませんでした。
次に、XSLT を使用してそれを実行しようとしましたが、要素間のセパレーターを取得する方法がわかりません (その場合、分割や結合を使用するだけでしょうか?) しかし、それらはすべて 1 つの文字列で一緒に実行されます。
列見出しを手動で手動で印刷しました。テンプレートでそれを行う簡単な方法はありますか?
私が見た同様の質問ですが、ファイルにセパレーターが追加されているのを確認できませんでした。XML からタブ区切りテキスト へ XML をタブ区切りテキスト ファイルに変換するための XSLT の変更
質問:
一般的に、これを行う最も簡単な方法は何ですか。また、XSLT (私が理解しようとしてきた) を使用する必要があります。
これを行うには、以下を修正するにはどうすればよいですか?
私は近いようですが、XSLT出力文字列に区切り文字を取得するだけでよいので、それを分割して、出力で「\ t」と結合してタブ区切りのテキストファイルにすることができます。??
これは私の XML (Twilio からの SMS ログ) です。
<?xml version="1.0" encoding="UTF-8"?>
<TwilioResponse>
<SMSMessages end="49" firstpageuri="/2010-04-01/Accounts/ACcbaa0/SMS/Messages?Page=0&PageSize=50" lastpageuri="/2010-04-01/Accounts/ACcbaa/SMS/Messages?Page=54&PageSize=50" nextpageuri="/2010-04-01/Accounts/ACcbaa0103c/SMS/Messages?Page=1&PageSize=50&AfterSid=SMc20cf7" numpages="55" page="0" pagesize="50" previouspageuri="" start="0" total="2703" uri="/2010-04-01/Accounts/ACcbaa0103cf/SMS/Messages">
<SMSMessage>
<Sid>SMe24eb108b7eb6a3b</Sid>
<DateCreated>Fri, 09 Aug 2013 00:07:59 +0000</DateCreated>
<DateUpdated>Fri, 09 Aug 2013 00:07:59 +0000</DateUpdated>
<DateSent>Fri, 09 Aug 2013 00:07:59 +0000</DateSent>
<AccountSid>ACcbaa0103c4141e5cd754042cb424d4ff</AccountSid>
<To>+14444444444</To>
<From>+15555555555</From>
<Body>Hi there!</Body>
<Status>sent</Status>
<Direction>outbound-api</Direction>
<Price>-0.01000</Price>
<PriceUnit>USD</PriceUnit>
<ApiVersion>2010-04-01</ApiVersion>
<Uri>/2010-04-01/Accounts/ACcbaa01/SMS/Messages/SMe24eb108b</Uri>
</SMSMessage>
<SMSMessage>
... etc. ...
</SMSMessage>
</SMSMessages>
</TwilioResponse>
これは私が使用しようとしていた XSLT です。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
<xsl:template match="//TwilioResponse">
<xsl:for-each select="SMSMessage">
<xsl:value-of select="Sid"/>
<!-- I tried all these, too:   	 even 
 -->
<xsl:text>	</xsl:text>
<!-- I also tried this from another SO question -->
<xsl:if test="position() != last()">, </xsl:if>
<xsl:value-of select="DateCreated"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="DateUpdated"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="DateSent"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="AccountSid"/>
<xsl:text>	</xsl:text>
<xsl:text>
</xsl:text>
<xsl:text> </xsl:text>
<xsl:text>	</xsl:text>
<xsl:value-of select="To"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="From"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="Body"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="Status"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="Direction"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="Price"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="PriceUnit"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="ApiVersion"/>
<xsl:text>	</xsl:text>
<xsl:value-of select="Uri"/>
<!-- I tried both of these: line feed char -->
<xsl:text>
</xsl:text>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
そして、これは私のPerlコードの関連部分です:
use XML::XSLT;
my $logs = $twilio -> GET ('SMS/Messages');
my $string = $logs->{content};
my $xsl = 'xsl.txt';
my $xslt = XML::XSLT->new ($xsl);
$xslt->transform ($string);
my $xsltToString = $xslt->toString;
print $xsltToString;
my $columnHeadings = "Sid\tDateCreated\tDateUpdated\tDateSent\tAccountSid\tTo\tFrom\tBody\tStatus\tDirection\tPrice\tPriceUnit\tApiVersion\tUri\n";
open(my $fh, '>', 'textfile.txt') || die("Unable to open file. $!");
print $fh $columnHeadings;
foreach my $k (@split) {
print $fh join("\t", $xsltToString) . "\t";
}
#print $fh split("\t", $val). "\t"; ;
close($fh);
$xslt->dispose();
# P.S. I'm sure there's a better way to check and see how many lines were saved.
my $xmllines = 0;
open $fh, '<', 'textfile.txt' or die "Could not open file. $!";
while (<$fh>) {
$xmllines++;
}
print ("\n" . $xmllines . " lines saved to tab-delimited logs textfile. \n");
close $fh;
私の出力は、どの要素も分離されていない、すべて 1 つのものです。