2016-04-20 8 views
0

にこのXMLを取得し、私はXSLTは、ここでは表形式

<?xml version="1.0" encoding="utf-8"?> 
     <!DOCTYPE population SYSTEM "http://www.matsim.org/files/dtd/population_v5.dtd"> 

     <population> 

     <!-- ====================================================================== --> 

      <person id="10000061"> 
       <plan score="219.62581874242716" selected="yes"> 
        <act type="home" link="21258" x="334867.243653" y="3126570.70778" start_time="03:00:00" end_time="15:07:00" /> 
        <leg mode="ride" dep_time="15:07:00" trav_time="00:03:27" arr_time="15:10:27"> 
         <route type="links">21258 14045 13977 13939 13925 13919 13905 13904</route> 
        </leg> 
        <act type="shop" link="13904" x="332634.86999" y="3127078.96383" start_time="15:12:00" end_time="16:21:00" /> 
        <leg mode="car" dep_time="16:21:00" trav_time="00:09:44" arr_time="16:30:44"> 
         <route type="links">13904 21207 21208 13980 21187 21188 14148 14144 14130 14129</route> 
        </leg> 
        <act type="shop" link="14129" x="331666.364904" y="3129306.48785" start_time="16:25:00" end_time="17:37:00" /> 
        <leg mode="ride" dep_time="17:37:00" trav_time="00:09:46" arr_time="17:46:46"> 
         <route type="links">14129 14143 14147 14161 14171 14189 14195 14120 14106 14051 13941 13938 13976 14044 21259 21258</route> 
        </leg> 
        <act type="home" link="21258" x="334867.243653" y="3126570.70778" start_time="17:45:00" end_time="26:59:00" /> 
       </plan> 

       <plan score="218.9756035020247" selected="no"> 
        <act type="home" link="21258" x="334867.243653" y="3126570.70778" start_time="03:00:00" end_time="15:07:00" /> 
        <leg mode="ride" dep_time="15:07:00" trav_time="00:03:26" arr_time="15:10:26"> 
         <route type="links">21258 14045 13977 13939 13925 13919 13905 13904</route> 
        </leg> 
        <act type="shop" link="13904" x="332634.86999" y="3127078.96383" start_time="15:12:00" end_time="16:21:00" /> 
        <leg mode="car" dep_time="16:21:00" trav_time="00:08:46" arr_time="16:29:46"> 
         <route type="links">13904 13905 13891 13855 21239 21240 13887 13885 13869 13870 13920 13974 14070 14075 14103 14109 14123 14129</route> 
        </leg> 
        <act type="shop" link="14129" x="331666.364904" y="3129306.48785" start_time="16:25:00" end_time="17:37:00" /> 
        <leg mode="ride" dep_time="17:37:00" trav_time="00:11:06" arr_time="17:48:06"> 
         <route type="links">14129 14143 14147 14161 14150 14098 14094 14095 14113 14106 14051 13941 13938 13976 14044 21259 21258</route> 
        </leg> 
        <act type="home" link="21258" x="334867.243653" y="3126570.70778" start_time="17:45:00" end_time="26:59:00" /> 
       </plan> 

       <plan score="218.5148700010285" selected="no"> 
        <act type="home" link="21258" x="334867.243653" y="3126570.70778" start_time="03:00:00" end_time="15:07:00" /> 
        <leg mode="ride" dep_time="15:07:00" trav_time="00:03:26" arr_time="15:10:26"> 
         <route type="links">21258 14045 13977 13939 13925 13919 13905 13904</route> 
        </leg> 
        <act type="shop" link="13904" x="332634.86999" y="3127078.96383" start_time="15:12:00" end_time="16:21:00" /> 
        <leg mode="car" dep_time="16:21:00" trav_time="00:08:15" arr_time="16:29:15"> 
         <route type="links">13904 13905 13906 13980 21187 21188 14148 14144 14130 14129</route> 
        </leg> 
        <act type="shop" link="14129" x="331666.364904" y="3129306.48785" start_time="16:25:00" end_time="17:37:00" /> 
        <leg mode="ride" dep_time="17:37:00" trav_time="00:11:18" arr_time="17:48:18"> 
         <route type="links">14129 14130 14124 14110 14104 14077 14071 13975 13921 13871 13868 13884 13886 13888 13894 13904 13918 13924 13938 13976 14044 21259 21258</route> 
        </leg> 
        <act type="home" link="21258" x="334867.243653" y="3126570.70778" start_time="17:45:00" end_time="26:59:00" /> 
       </plan> 

      </person> 

     <!-- ====================================================================== --> 

      <person id="10000302"> 
       <plan score="209.66504470021556" selected="yes"> 
        <act type="home" link="21256" x="334598.361546" y="3126269.05167" start_time="03:00:00" end_time="07:56:00" /> 
        <leg mode="car" dep_time="07:56:00" trav_time="00:03:00" arr_time="07:59:00"> 
         <route type="links">21256 13966 14056 14057</route> 
        </leg> 
        <act type="work" link="14057" x="335957.065395" y="3128105.16619" start_time="08:04:00" end_time="10:28:00" /> 
        <leg mode="car" dep_time="10:28:00" trav_time="00:08:20" arr_time="10:36:20"> 
         <route type="links">14057 14049 14045 13977 13939 13925 13919 21207 21208 13980 14046 14095 21191</route> 
        </leg> 
        <act type="social" link="21191" x="333032.807855" y="3128759.66141" start_time="10:33:00" end_time="11:52:00" /> 
        <leg mode="car" dep_time="11:52:00" trav_time="00:08:33" arr_time="12:00:33"> 
         <route type="links">21191 21194 14189 14195 14197 14210 14212 14234 14246 14215 14192 14178 14057 13967 21257 21256</route> 
        </leg> 
        <act type="home" link="21256" x="334598.361546" y="3126269.05167" start_time="11:59:00" end_time="12:11:00" /> 
        <leg mode="car" dep_time="12:11:00" trav_time="00:06:35" arr_time="12:17:35"> 
         <route type="links">21256 21257 21258 14045 13977 13939 13925 13919 13905 13906</route> 
        </leg> 
        <act type="social" link="13906" x="332302.159169" y="3127536.46778" start_time="12:17:00" end_time="13:30:00" /> 
        <leg mode="car" dep_time="13:30:00" trav_time="00:05:30" arr_time="13:35:30"> 
         <route type="links">13906 13907 13904 13918 13924 13938 13976 14044 21259 21256</route> 
        </leg> 
        <act type="home" link="21256" x="334598.361546" y="3126269.05167" start_time="13:36:00" end_time="26:59:00" /> 
       </plan> 

       <plan score="205.5456839457717" selected="no"> 
        <act type="home" link="21256" x="334598.361546" y="3126269.05167" start_time="03:00:00" end_time="07:56:00" /> 
        <leg mode="car" dep_time="07:56:00" trav_time="00:02:15" arr_time="07:58:15"> 
         <route type="links">21256 13966 14056 14057</route> 
        </leg> 
        <act type="work" link="14057" x="335957.065395" y="3128105.16619" start_time="08:04:00" end_time="10:28:00" /> 
        <leg mode="car" dep_time="10:28:00" trav_time="00:06:51" arr_time="10:34:51"> 
         <route type="links">14057 14056 14177 14191 14214 14247 14235 14213 14211 14198 14120 14114 21191</route> 
        </leg> 
        <act type="social" link="21191" x="333032.807855" y="3128759.66141" start_time="10:33:00" end_time="11:52:00" /> 
        <leg mode="car" dep_time="11:52:00" trav_time="00:07:45" arr_time="11:59:45"> 
         <route type="links">21191 21194 14189 14195 14197 14210 14212 14234 14246 14215 14192 14178 14057 13967 21257 21256</route> 
        </leg> 
        <act type="home" link="21256" x="334598.361546" y="3126269.05167" start_time="11:59:00" end_time="12:11:00" /> 
        <leg mode="car" dep_time="12:11:00" trav_time="00:07:51" arr_time="12:18:51"> 
         <route type="links">21256 13915 13823 13767 13743 13731 13732 13837 13831 13819 13820 13854 13890 13906</route> 
        </leg> 
        <act type="social" link="13906" x="332302.159169" y="3127536.46778" start_time="12:17:00" end_time="13:30:00" /> 
        <leg mode="car" dep_time="13:30:00" trav_time="00:08:54" arr_time="13:38:54"> 
         <route type="links">13906 13907 13904 13918 13924 13938 13976 14044 21259 21256</route> 
        </leg> 
        <act type="home" link="21256" x="334598.361546" y="3126269.05167" start_time="13:36:00" end_time="26:59:00" /> 
       </plan> 

       <plan score="203.4205865037132" selected="no"> 
        <act type="home" link="21256" x="334598.361546" y="3126269.05167" start_time="03:00:00" end_time="07:56:00" /> 
        <leg mode="car" dep_time="07:56:00" trav_time="00:03:15" arr_time="07:59:15"> 
         <route type="links">21256 13966 14056 14057</route> 
        </leg> 
        <act type="work" link="14057" x="335957.065395" y="3128105.16619" start_time="08:04:00" end_time="10:28:00" /> 
        <leg mode="car" dep_time="10:28:00" trav_time="00:06:41" arr_time="10:34:41"> 
         <route type="links">14057 14049 14045 13977 13939 13940 14050 14105 14114 21191</route> 
        </leg> 
        <act type="social" link="21191" x="333032.807855" y="3128759.66141" start_time="10:33:00" end_time="11:52:00" /> 
        <leg mode="car" dep_time="11:52:00" trav_time="00:09:12" arr_time="12:01:12"> 
         <route type="links">21191 21194 14189 14195 14197 14210 14212 14234 14246 14215 14192 14178 14057 13967 21257 21256</route> 
        </leg> 
        <act type="home" link="21256" x="334598.361546" y="3126269.05167" start_time="11:59:00" end_time="12:11:00" /> 
        <leg mode="car" dep_time="12:11:00" trav_time="00:05:10" arr_time="12:16:10"> 
         <route type="links">21256 13966 14049 14045 13977 13939 13925 13919 13905 13906</route> 
        </leg> 
        <act type="social" link="13906" x="332302.159169" y="3127536.46778" start_time="12:17:00" end_time="13:30:00" /> 
        <leg mode="car" dep_time="13:30:00" trav_time="00:05:30" arr_time="13:35:30"> 
         <route type="links">13906 13907 13904 13918 13924 13938 13976 14044 21259 21256</route> 
        </leg> 
        <act type="home" link="21256" x="334598.361546" y="3126269.05167" start_time="13:36:00" end_time="26:59:00" /> 
       </plan> 

      </person> 

     <!-- ====================================================================== --> 

     </population> 

を持っているxmlファイルの小さなサンプルである私は、次の表のような構造に

現在
<?xml version="1.0" encoding="UTF-8"?> 
1,10000061,home,21258,334867.243653,3126570.70778,03:00:00,15:07:00,ride,15:07:00,00:03:27,15:10:27 
2,10000061,shop,13904,332634.86999,3127078.96383,15:12:00,16:21:00,car,16:21:00,00:09:44,16:30:44 
3,10000061,shop,14129,331666.364904,3129306.48785,16:25:00,17:37:00,ride,17:37:00,00:09:46,17:46:46 
4,10000061,home,21258,334867.243653,3126570.70778,17:45:00,26:59:00,,,, 
5,10000302,home,21256,334598.361546,3126269.05167,03:00:00,07:56:00,car,07:56:00,00:03:00,07:59:00 
6,10000302,work,14057,335957.065395,3128105.16619,08:04:00,10:28:00,car,10:28:00,00:08:20,10:36:20 
7,10000302,social,21191,333032.807855,3128759.66141,10:33:00,11:52:00,car,11:52:00,00:08:33,12:00:33 
8,10000302,home,21256,334598.361546,3126269.05167,11:59:00,12:11:00,car,12:11:00,00:06:35,12:17:35 
9,10000302,social,13906,332302.159169,3127536.46778,12:17:00,13:30:00,car,13:30:00,00:05:30,13:35:30 
10,10000302,home,21256,334598.361546,3126269.05167,13:36:00,26:59:00,,,, 

をこれを変換する必要があります私は以下のXSLTスタイルシートを使用しています。これは私に別のフォーマットを与えます。上記のフォーマットを得るために、このスタイルシートを修正してもらえますか?

<xsl:stylesheet version="3.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    expand-text="yes"> 
    <xsl:template name="xsl:initial-template"> 
    <xsl:stream href="100.plans.xml"> 
     <xsl:for-each select="/population/person | /population/person/plan[@selected='yes']/act | /population/person/plan[@selected='yes']/leg"> 
     {position()},{@id},{@type},{@link},{@x},{@y},{@start_time},{@end_time},{@mode},{@dep_time},{@trav_time},{@arr_time} 
     </xsl:for-each> 
    </xsl:stream> 
    </xsl:template> 
</xsl:stylesheet> 
+0

XSLT 3.0のストリーミング機能を使用してそのファイルを処理しようとすると、ストリーミングを使用せずに処理できない非常に大きなファイルを処理する必要がありますか?そうであれば、個々の「人」または個々の「計画」要素のサイズがかなり小さい、大規模な、多くの「人」要素が原因でしょうか?そうすれば、 'person'または' plan'要素を流すことができますが、 'copy-of()'を使って通常の処理に切り替えることができます。 –

+0

はい。ファイルが大きいです。これがXSLTのストリーミング機能を使用しようとした理由です。ストリーミングモードを使わずに読んでみたいと思ったら、必要な変更を教えてもらえますか? – Gandalf

+0

さて、Timはストリーミングを一切使わない答えをあなたにくれました。ストリーミングを使いたいが、それぞれの人口/人/プラン[@selected = 'yes'] 'をメモリに入れて生きることができるなら、後ほど例を投稿しようとします。 –

答えて

2

H EREができないだけで、各/population/person/plan[@selected='yes']と純粋なストリーミング方法で、兄弟のアクセスとしてsnapshot()を使用してメモリにその祖先を引っ張るストリーミングサンプルである私は思う:サクソン9.7 EEを使用してサンプル入力用

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="3.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    expand-text="yes"> 

    <xsl:output method="text"/> 

    <xsl:template name="xsl:initial-template"> 
     <xsl:stream href="100.plans.xml"> 
      <xsl:for-each select="/population/person/plan[@selected='yes']/snapshot()/act"> 
       <xsl:variable name="leg" select="following-sibling::*[1][self::leg]" /> 
       <xsl:value-of select="position(), ../../@id, @type, @link, @x, @y, @start_time, @end_time, string($leg/@mode), string($leg/@dep_time), string($leg/@trav_time), string($leg/@arr_time)" separator=","/> 
       <xsl:text>&#10;</xsl:text> 
      </xsl:for-each> 
     </xsl:stream> 
    </xsl:template> 

</xsl:stylesheet> 

出力が

です
1,10000061,home,21258,334867.243653,3126570.70778,03:00:00,15:07:00,ride,15:07:00,00:03:27,15:10:27 
2,10000061,shop,13904,332634.86999,3127078.96383,15:12:00,16:21:00,car,16:21:00,00:09:44,16:30:44 
3,10000061,shop,14129,331666.364904,3129306.48785,16:25:00,17:37:00,ride,17:37:00,00:09:46,17:46:46 
4,10000061,home,21258,334867.243653,3126570.70778,17:45:00,26:59:00,,,, 
5,10000302,home,21256,334598.361546,3126269.05167,03:00:00,07:56:00,car,07:56:00,00:03:00,07:59:00 
6,10000302,work,14057,335957.065395,3128105.16619,08:04:00,10:28:00,car,10:28:00,00:08:20,10:36:20 
7,10000302,social,21191,333032.807855,3128759.66141,10:33:00,11:52:00,car,11:52:00,00:08:33,12:00:33 
8,10000302,home,21256,334598.361546,3126269.05167,11:59:00,12:11:00,car,12:11:00,00:06:35,12:17:35 
9,10000302,social,13906,332302.159169,3127536.46778,12:17:00,13:30:00,car,13:30:00,00:05:30,13:35:30 
10,10000302,home,21256,334598.361546,3126269.05167,13:36:00,26:59:00,,,, 
+0

これは完璧に動作します。あなたの助けを借りてありがとう、マーティン。 – Gandalf

1

あなたが実際に出力する各act要素の行をしたいが、その行が祖先person、あまりにもlegノードを次からの情報が含まれますように見えます。

{../../@id} 

は、以下のleg要素から情報を取得するには...

<xsl:for-each select="/population/person/plan[@selected='yes']/act"> 

は、あなたがこれを行うだろうperson要素のidを取得するには:これはxsl:for-eachは本当にこのようにする必要がありますを意味し、あなたはとても...

<xsl:variable name="leg" select="following-sibling::*[1][self::leg]" /> 

のような変数を定義することができます。そして、あなたはから情報を取得します、私は自分自身をテストするために手にXSLT 3.0プロセッサを持っていませんが、XSLT 1.0で、それは(私はそれが短い取得するために、すべてのフィールドが含まれていませんでした。このようになります。この

{$leg/@mode} 

を行うだろう)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:template match="/"> 
     <xsl:for-each select="/population/person/plan[@selected='yes']/act"> 
     <xsl:variable name="leg" select="following-sibling::*[1][self::leg]" /> 
     <xsl:value-of select="position()" /> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="../../@id" /> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="@type" /> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="$leg/@mode" /> 
     <xsl:text>&#10;</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

EDIT:それは確かにすべてのactの要素が最後のものを除いてleg要素を以下している場合であれば、代わりにこのXSLTを試す

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:template match="/"> 
     <xsl:for-each select="/population/person/plan[@selected='yes']/*[self::act|self::leg]"> 
     <xsl:choose> 
      <xsl:when test="self::act"> 
      <xsl:value-of select="position()" /> 
      <xsl:text>,</xsl:text> 
      <xsl:value-of select="../../@id" /> 
      <xsl:text>,</xsl:text> 
      <xsl:value-of select="@type" /> 
      <xsl:text>,</xsl:text> 
      <xsl:value-of select="@link" /> 
      </xsl:when> 
      <xsl:when test="self::leg"> 
      <xsl:text>,</xsl:text> 
      <xsl:value-of select="@mode" /> 
      <xsl:text>,</xsl:text> 
      <xsl:value-of select="@dep_time" /> 
      <xsl:text>&#10;</xsl:text> 
      </xsl:when> 
     </xsl:choose> 
     </xsl:for-each> 
     <xsl:text>,,&#10;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
+0

SAXONを使ってXSLT 3.0であなたのソリューションを実装しようとしました。しかし、私はこのエラーを受け取ります。 'readsplans.xsl: の8行目の38行目のxsl:stream/@ hrefの静的エラーXTSE3430:xsl:stream命令のボディーがストリーミングできない *コンテキストの姿勢がストライドしているときに次の兄弟軸を使用できません' – Gandalf

+0

:10行で E 10) *述語は、私は' は '<価値の選択= "$レグ/ @モードを"/ XSL>'使用して属性を印刷しようとすると、エラーが発生 をmotionless'されていませんああ'xsl:stream'に慣れていないので、' follow-sibling'を使うことはできません。私はおそらく、この場合にはうまくいかないので、私の答えを削除する必要があります。私がする前に、XMLを見て、すべての 'act'要素は、' plan'の最後の 'act'を除いて、' leg'要素を持っていますか? –

+0

はい。それは確かに事実です。 'act'タグのすべては、最後のものを除いて、後続の' leg'タグを持っています。たぶんあなたはそれを削除することなく答えを保持することができます。これは問題の一部を確実に解決します(つまり、対応する '行'行ごとに.person idを取得します)。 – Gandalf

関連する問題