XML から単純なプレーン テキスト出力を生成するには、XSL を使用する必要がありました。オンラインで適切で簡潔な例が見つからなかったため、ここにソリューションを投稿することにしました。もちろん、より良い例を参照しているリンクは大歓迎です。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:for-each select="script/command" xml:space="preserve">at -f <xsl:value-of select="username"/> <xsl:value-of select="startTime/@hours"/>:<xsl:value-of select="startTime/@minutes"/> <xsl:value-of select="startDate"/><xsl:text>
</xsl:text></xsl:for-each>
</xsl:template>
</xsl:stylesheet>
ここで私を助けたいくつかの重要なこと:
- xsl:output を使用して、出力ドキュメントの先頭にある標準宣言を省略します。
- xml:space="preserve" 属性を使用して、xsl:for-each タグ内に記述した空白を保持します。これにより、for-each タグ内のすべてのコード (そのタグも含む) を 1 行で記述する必要がありました (改行を除く)。
- を使用して改行を挿入します。ここでも、標準の xml インデントを省略しなければなりませんでした。
この xslt の結果として必要な出力は次のとおりです。
-f alluser 23:58 17.4.2010
-f ggroup67 7:58 28.4.2010
-f ggroup70 15:58 18.4.2010
-f alluser 23:58 18.4.2010
-f ggroup61 7:58 22.9.2010
-f ggroup60 23:58 21.9.2010
で -f alluser 3:58 22.9.2010
私が言ったように、これをよりエレガントに行う方法についての提案をいただければ幸いです。
フォローアップ 2011-05-08:
私が扱っているxmlのタイプは次のとおりです。
<script xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="script.xsd">
<command>
<username>alluser</username>
<startTime minutes="58" hours="23"/>
<startDate>17.4.2010</startDate>
</command>
</script>