【问题标题】:how to get this elements using template toolkit如何使用模板工具包获取这些元素
【发布时间】:2011-12-17 02:24:25
【问题描述】:

嗨,我有这样的 xml 数据

<university>
     <name>svu</name>
     <location>ravru</location>
      <branch>
           <electronics>
                  <Section>
                      <student name="xxx" number="12">
                           <sem semister="1"subjects="7" rank="1"/>
                           <sem semister="2"subjects="4" rank="1"/>
                      <student>
                      <student name="xxx" number="15">
                           <sem semister="1"subjects="7" rank="10"/>
                           <sem semister="2"subjects="4" rank="1"/>
                      <student>
                      <student name="xxx" number="16">
                           <sem semister="1"subjects="7" rank="2"/>
                           <sem semister="2"subjects="4" rank="2"/>
                      <student>
                 </section>
            </electronics>
         </branch>
 </university>
 <university>
     <name>sku</name>
     <location>ANTP</location>
      <branch>
           <computers>
                  <Section>
                      <student name="xxx" number="12">
                           <sem semister="1"subjects="7" rank="no"/>
                           <sem semister="2"subjects="4" rank="no"/>
                      <student>
                      <student name="xxx" number="15">
                           <sem semister="1"subjects="7" rank="10"/>
                           <sem semister="2"subjects="4" rank="1"/>
                      <student>
                      <student name="xxx" number="16">
                           <sem semister="1"subjects="7" rank="20"/>
                           <sem semister="2"subjects="4" rank="21"/>
                      <student>
                 </section>
            </electronics>
         </branch>
 </university>

我使用 XML::Simple 生成哈希结构化数据并存储在一个变量中。我使用 template::toolkit 生成 pdffile(使用 pdflatex)。我的 XML::simple 输出是这样的

$var1={
     university=>{
          'name'=>'svu',
           'location'=>'ravru',
            'branch'=>{
                     'electronics'=>{
                                'section'=>[
                                         {
                                        'name'=>'xxx',
                                         'number'=>'12',
                                           'sem'=>[
                                                {
                                               'semister'=>'1',
                                                'subjects'=>'7',
                                                 'rank'=>'1'
                                                  },
                                                 {
                                                'semister'=>'2',
                                                'subjects'=>'4',
                                                 'rank'=>'1'
                                                  }
                                                 ]
                                               },
                                             {
                                        'name'=>'xxx',
                                         'number'=>'15',
                                           'sem'=>[
                                                {
                                               'semister'=>'1',
                                                'subjects'=>'7',
                                                 'rank'=>'10'
                                                  },
                                                 {
                                                'semister'=>'1',
                                                'subjects'=>'7',
                                                 'rank'=>'1'
                                                  }
                                                 ]
                                               },
                                              {
                                        'name'=>'xxx',
                                         'number'=>'16',
                                           'sem'=>[
                                                {
                                               'semister'=>'1',
                                                'subjects'=>'7',
                                                 'rank'=>'2'
                                                  },
                                                 {
                                                'semister'=>'2',
                                                'subjects'=>'4',
                                                 'rank'=>'2'
                                                  }
                                                 ]
                                               }
                                             }
                                          ]
                                         }
                                       };

像这样我有 15 所大学,还有一些部门只有两三个学生,有的有 10 个学生,在学生中,有的只有一个 sem,有的有两个学期。我这样写模板

my $template = Template->new();
 my $filename = 'output.tex';
   $template->process(\*DATA, $data, $filename)
|| die "Template process failed: ", $template->error(), "\n";
  system( "pdflatex $filename" );
  __DATA__
 \documentclass[a4paper,leqno,twoside]{article}
  \begin{document}
  [% FOREACH st = university %]
   [%+ st.name +%]
   [%+ st.location +%]
 [% FOREACH section = st.branch.electronics.section %]
  branch student: [%+ section.name +%]
 [%+ section.number +%]
 [% FOREACH sem = section.sem %]
    [%+ sem.semister +%]
    [%+ sem.subjects +%]
    [%+ sem.rank +%]
[% END %]
 [% END %]
   [% END %]
  /end{document}

这样它会给出输出,但我的问题是它太长了,而且我在上面说有些部分有两个学生,有些部分有两个以上。例如,第一部分包含 1 名学生,第二部分包含 10 名学生。但在 pdf 第一部分也打印 10 个学生,只有第一个学生的信息全部为空。我怎样才能消除这个问题。 如果您不理解我的问题,我该如何使用比我编写的更短的代码来获取数据。有没有其他方法可以更简单地使用 for 循环来获取分支元素或任何简单的代码。因为如果某个部分有 60 名学生,那么它会在每个部分中打印 6o。

【问题讨论】:

  • 请您告诉我如何在 for 循环中使用循环来仅获取部分信息。

标签: perl templates template-toolkit


【解决方案1】:

我认为您只需要在这些部分上再添加一个FOREACH,如下所示:

[%+ university.name +%]
[%+ university.location +%]
[% FOREACH section = university.branch.electronics.section %]
    branch student: [%+ section.name +%]
    [%+ section.number +%]
    [% FOREACH sem = section.sem %]
        [%+ sem.semister +%]
        [%+ sem.subjects +%]
        [%+ sem.rank +%]
    [% END %]
[% END %]

您可能需要添加 custom filtercustom vmethodplugin 以确保您的所有字符串都正确转义以便在 LaTeX 中使用。如果您不关心如何处理换行符,请使用[% ... %][%+ ... +%] 版本会保留前导和尾随空格。

【讨论】:

  • 嗨,我像你说的那样尝试过,但只有当我们在一个部分中有两个或更多学生时它才会给出输出,而且它只打印一个半学期的科目并在一个学生中排名。如果我们在一个学生中有两个半学期,则不会打印第二个半学期。
  • @pavani:我想我误解了你的数据结构,请看看我的更新。
  • @pavani:最好的办法是标准化数据,以便sectionsemuniversity 以及其他任何可以重复的内容始终表示为数组而不是数组当只有一个时,有几个但一个哈希引用。您正在使用的 XML 加载器应该有一个选项。
  • @pavani: XML::Simple 很好,看看ForceArray 选项,你也可以使用ForceArray on just a few elements。因此,在 XML 中有时包含多个项目的事物上使用 ForceArray,然后您可以始终将它们视为 Perl 和 TT 中的数组。
  • 您好,我将 ForceArray 用于重复元素,现在它可以正常工作并打印我想要的。非常感谢您的建议和帮助。
【解决方案2】:

您在上面粘贴的内容在语法上似乎不正确。你在开玩笑吗:)?

无论如何,请阅读Introduction of the manual.... 将您的结构传递给 TT 存储后,您可以访问其元素,例如:

[% var1.STC.0.gym.hyd.com (AND SO ON) %]

你应该避免太深的结构。

【讨论】:

  • 对不起,现在你可以看看我上面解释的洞问题。还是如果你不明白问我。
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
相关资源
最近更新 更多