STXでXMLからCSVに

STX : Streaming Transformations for XML
STXをつかってXMLからCSV
MLにサンプルっぽのがあった。
http://archive.gingerall.cz/archives/public/stx2004/msg00079.html

謎なのでとりあえずちょびっといじって、OKって事にした。

<?xml version="1.0"?>
<person>
  <name>xxx</name>
  <email>yyy</email>
  <phone>zzz</phone>
</person>
<?xml version="1.0"?>
<!-- join example -->
<stx:transform xmlns:stx="http://stx.sourceforge.net/2002/ns" version="1.0"
               pass-through="text">

  <stx:variable name="names" select="('name', 'email', 'phone')" />
  <stx:variable name="values" />
    
  <stx:procedure name="init">
    <stx:assign name="values" select="()" />
    <stx:for-each-item select="$names" name="i">
      <stx:assign name="values" select="('', $values)" />
    </stx:for-each-item>
  </stx:procedure>
    
  <stx:template match="name|email|phone">  <!-- or "person/*" -->
    <stx:variable name="no" select="1" />
    <stx:for-each-item select="$names" name="i">
      <stx:if test="$i = name()">
        <stx:assign name="values" 
                    select="(subsequence($values, 1, $no - 1), ., 
                             subsequence($values, $no +1))" />
      </stx:if>
      <stx:assign name="no" select="$no + 1" />
    </stx:for-each-item>
  </stx:template>

  <stx:template match="person">
    <stx:call-procedure name="init" />
    <stx:process-children />
    <stx:value-of select="$values" separator=", " />
    <stx:text>&#xA;</stx:text>
  </stx:template>
  
</stx:transform>

とか適当なこと書いてたけど stxはほとんどからっぽでも、中身解析してそのままだしてくれる

<?xml version="1.0"?>
<stx:transform xmlns:stx="http://stx.sourceforge.net/2002/ns" version="1.0"
               xmlns:d="http://purl.org/dc/elements/1.0/"
               pass-through="text">
</stx:transform>

ただ

みたいな形だとちゃんとやらないとだめっぽ

XML::STX http://search.cpan.org/~pcimprich/XML-STX-0.43/STX.pm

しかしほんとSTXないとちまちまファイル分割したり、しかも分割してタグが途中だったりとか・・ STXすばらしす