This may have some idea where to start, or then again it might not :)
#!/usr/bin/perl
use strict; # https://perlmonks.org/?node_id=11163097
use warnings;
use List::Util qw( reduce );
local $/ = ''; # read paragraphs
while( <DATA> )
{
my @terms = /<term>(.*?)</g;
print "Input: @terms\n";
my @fails;
reduce {
if( $a =~ /^\d/ )
{
$a + 1 == $b or push @fails, "fail at $a -> $b\n";
}
else
{
my $left = $a =~ tr/a-z/b-za/r =~ s/^a/aa/r;
$left eq $b or push @fails, "fail at $a -> $b\n";
}
$b } @terms;
print @fails;
print "\n";
}
__DATA__
<list>
<item>
<term>1.</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>3.</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>4.</term>
<para>jhjhjh hjkjkjkj</para>
</item>
</list>
<list>
<item>
<term>a)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>b)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>d)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
</list>
<list>
<item>
<term>aa)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>cc)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>dd)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
</list>
<list>
<item>
<term>xx)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>yy)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>zz)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>aaa)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>bbb)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>yyy)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>zzz)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
<item>
<term>aaa)</term>
<para>jhjhjh hjkjkjkj</para>
</item>
</list>
Outputs:
Input: 1. 3. 4.
fail at 1. -> 3.
Input: a) b) d)
fail at b) -> d)
Input: aa) cc) dd)
fail at aa) -> cc)
Input: xx) yy) zz) aaa) bbb) yyy) zzz) aaa)
fail at bbb) -> yyy)
fail at zzz) -> aaa)