0

LaTeX から PrinceXML に移行しています。私がしなければならないことの 1 つは、参考文献を変換することです。.bibファイルを HTML に変換しました。ただし、LaTeX がエントリの並べ替えを処理してくれたので、エントリを正しい順序に並べるようには気を配っていませんでしたが、HTML では宣言の順序が重要です。

したがって、私の問題は次のとおりです。Linuxコマンドラインツールを使用して(たとえば、Perlは受け入れられますが、Javascriptは受け入れられません)、次のようにソースファイルをソートするにはどうすればよいですか:

<div id="references">
    <h2>References</h2>

    <ul>
        <li id="reference-to-book-1">
            <span class="ref-author">Sample, Peter</span>
            <cite><a href="http://example.org/">Online Book 1</a></cite>
            <span class="ref-year">2011</span>
        </li>
        <li id="reference-to-book-2">
            <cite>Physical Book 2</cite>
            <span class="ref-year">2012</span>
            <span class="ref-author">Example, Sandy</span>
        </li>
    </ul>
</div><!-- references -->

次のようになります。

<div id="references">
    <h2>References</h2>

    <ul>
        <li id="reference-to-book-2">
            <span class="ref-author">Example, Sandy</span>
            <cite>Physical Book 2</cite>
            <span class="ref-year">2012</span>
        </li>
        <li id="reference-to-book-1">
            <span class="ref-author">Sample, Peter</span>
            <cite><a href="http://example.org/">Online Book 1</a></cite>
            <span class="ref-year">2011</span>
        </li>
    </ul>
</div><!-- references -->

基準は次のとおりです。

  1. エントリを含む要素は、<li>作成者に従ってアルファベット順にソートされます (つまり、1<li id="から対応するものまですべて</li>が単一のブロックとして移動されます)。
  2. 各エントリ内で、要素は次の順序になっています。
    1. ラインマッチclass="ref-author"
    2. ラインマッチ<cite>
    3. ラインマッチclass="ref-year"
    4. より多くの要素があります (例:class="publisher"わかりやすくするために例から省略しました)。また、この並べ替えの問題に頻繁に遭遇します。そのため、一致させる式を自由に指定できると便利です (たとえば、スクリプト内の配列宣言として)。
  3. ファイルの残りの部分 ( の外側/id="references"/,/-- references --/) は変更されません。
  4. 結果ファイルでは、ファイル内の位置を除いて、各行は変更されていません (この点が追加されたのは、試した XML パーサーがインデントを壊したためです)。

sedandを使用して 1、3、および 4 を解決しsortましたが、2 をそのように機能させることはできません。

4

2 に答える 2

2

これにはMojoを使用します。後で XMLを整理する必要がある場合があります。

use Mojo::Base -strict;
use Mojo::DOM;
use Mojo::Util 'slurp';

my $xml = slurp $ARGV[0] or die "I need a file";

my $dom = Mojo::DOM->new($xml);

my $list = $dom->at('#references ul');

my $refs = $dom->find('li');

$refs->each('remove');

$refs = $refs->sort( sub { $a->at('.ref-author')->text cmp $b->at('.ref-author')->text } );

for my $ref ( @{ $refs } ){


    my $new = Mojo::DOM->new('<li></li>')->at('li');
    $new->append_content($ref->at('.ref-author'));
    $new->append_content($ref->at('cite'));

    #KEEP APPENDING IN THE ORDER YOU WANT THEM


    $list->append_content($new);

}

say $dom;
于 2015-05-21T16:02:27.500 に答える
0

XML::LibXMLモジュールを使用して、データを HTML として解析することをお勧めします。次に、必要に応じて DOM を操作し、変更された構造を元に出力できます。

これがどのように機能するかの例です

use strict;
use warnings;

use XML::LibXML;

my $dom = XML::LibXML->load_html(IO  => \*DATA);

my ($refs) = $dom->findnodes('/html/body//div[@id="references"]/ul');

my @refs = $refs->findnodes('li');

$refs->removeChild($_) for @refs;

$refs->appendChild($_) for sort {
  my ($aa, $bb) = map { $_->findvalue('span[@class="ref-author"]') } $a, $b;
  $aa cmp $bb;
} @refs;

print $dom, "\n";


__DATA__
<html>
  <head>
  <title>Title</title>
  </head>
  <body>
    <div id="references">
        <h2>References</h2>

        <ul>
            <li id="reference-to-book-1">
                <span class="ref-author">Sample, Peter</span>
                <cite><a href="http://example.org/">Online Book 1</a></cite>
                <span class="ref-year">2011</span>
            </li>
            <li id="reference-to-book-2">
                <cite>Physical Book 2</cite>
                <span class="ref-year">2012</span>
                <span class="ref-author">Example, Sandy</span>
            </li>
        </ul>
    </div><!-- references -->
  </body>
</html>

出力

<?xml version="1.0" standalone="yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><head><title>Title</title></head><body>
    <div id="references">
        <h2>References</h2>

        <ul>

        <li id="reference-to-book-2">
                <cite>Physical Book 2</cite>
                <span class="ref-year">2012</span>
                <span class="ref-author">Example, Sandy</span>
            </li><li id="reference-to-book-1">
                <span class="ref-author">Sample, Peter</span>
                <cite><a href="http://example.org/">Online Book 1</a></cite>
                <span class="ref-year">2011</span>
            </li></ul></div><!-- references -->
  </body></html>
于 2015-05-21T13:26:20.100 に答える